在 LBS(基于位置的服务)应用中,常见的需求包括:
✅ 查询附近的人(社交应用、打车、配送等)
✅ 查询某个点是否在指定范围内(地理围栏,例如外卖配送范围、进出考勤范围)
✅ 查找某个区域内的所有点(如商家、用户)
MySQL 5.7+ 提供了GIS(地理信息系统)支持,包括空间数据类型(Point、Geometry)和空间索引(SPATIAL INDEX),可以高效存储和查询地理数据。本文将介绍 MySQL 如何实现“附近的人”和“地理围栏”查询,并提供高效的索引优化方案。
1. 创建用户位置表(存储经纬度)
首先,我们创建一个 user_location 表来存储用户的地理位置信息。
CREATE TABLE user_location (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL, -- 用户 ID
location POINT NOT NULL, -- 经纬度坐标
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
SPATIAL INDEX idx_location (location) -- 空间索引
);
✅ 优化点:
- POINT NOT NULL 存储地理坐标(格式:POINT(longitude, latitude),经度在前,纬度在后!)。
- SPATIAL INDEX 空间索引加速地理查询。
- updated_at 记录最后更新时间,方便清理过期位置数据。
2. 插入用户位置数据
使用 ST_GeomFromText() 存储 POINT(经度 纬度) 格式的数据。
INSERT INTO user_location (user_id, location)
VALUES

最低0.47元/天 解锁文章
64

被折叠的 条评论
为什么被折叠?



