MySQL 实战案例:地理空间数据处理——附近的人、地理围栏查询实现

在 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值