*** MYSQL 算法难题: 查询距离指定坐标 10 公里范围内的所有店铺 ***

2024-03-10 17:50:59 +08:00
Angela2022  Angela2022
我有 MYSQL 表含 20 万条记录, 每条记录有店铺和位置经纬度字段. 现在我用 sql 查询距离指定坐标半径 10 公里内的所有店铺, 发现查询速度奇慢, 做了 index 后也是如此.

问题:
1. 上述需求,用啥数据格式的字段存位置经纬度合适?
2. 求最新最快的半径 10 公里内的所有店铺查询算法, 最好支持 MYSQL.

谢谢
14548 次点击
所在节点   程序员  程序员
107 条回复
xmumiffy
xmumiffy
2024-03-10 17:58:45 +08:00
where 条件限制经纬度差距各+-0.1 度,然后再算
leaflxh
leaflxh
2024-03-10 18:02:35 +08:00
先把店铺按照城市区域分好区
dode
dode
2024-03-10 18:04:53 +08:00
建一个大一些的基础网格系统,正方形,三角形,六边形,提前划分标记一下这些经纬度
akira
akira
2024-03-10 18:06:52 +08:00
你先说下 你怎么计算距离的呢
wenber
wenber
2024-03-10 18:09:05 +08:00
HanSonJ
HanSonJ
2024-03-10 18:14:10 +08:00
https://redis.io/docs/data-types/geospatial/

我第一次见坐标用 MySQL 实现的。。。你不得算距离啊
liprais
liprais
2024-03-10 18:15:01 +08:00
mysql 也有 geo 功能,自己看看文档呗
toneewang
toneewang
2024-03-10 18:16:55 +08:00
这个需求是不是可以用空间数据类型来存啊
toneewang
toneewang
2024-03-10 18:17:15 +08:00
xmumiffy
xmumiffy
2024-03-10 18:19:46 +08:00
@xmumiffy 经度有错误,还要除余弦
V2April
V2April
2024-03-10 18:20:22 +08:00
@dode 六边形感觉是个有意思的思路,像文明 6 那样数格子就行了
rabbbit
rabbbit
2024-03-10 18:21:02 +08:00
Redis geo 或者 PostGIS
laminux29
laminux29
2024-03-10 18:24:27 +08:00
思路错了。这就好比,你选择用汇编去实现,然后发个新帖子:汇编算法难题。

正确的思路是,选择支持地理范围直接查询的数据库,用它做个冗余数据库,专门做地理查询服务就行了,不要为难 MySQL ,很多场景,Mysql 并不适合。
ZoR
2024-03-10 18:25:06 +08:00
redis
amon
2024-03-10 18:27:04 +08:00
XY 问题,你还是使用 GEO 存储吧
546L5LiK6ZOt
2024-03-10 18:32:11 +08:00
之前做过地理位置相关的,经纬度小数点第一位精度是 10 公里左右,数据库按一位小数存经纬度,查询 sql 就变成等值查询了
BeiChuanAlex
2024-03-10 18:35:09 +08:00
我在想如果用 postgresql 会不会更好写。
Vegetable
2024-03-10 18:41:28 +08:00
@546L5LiK6ZOt 这也太糊弄了,0.9 和 1.1 匹配吗?
mikewang
2024-03-10 18:45:55 +08:00
根据坐标和 10 公里的条件,确定极限范围:
A <= 经度 <= B
C <= 纬度 <= D
然后在查到的数据中,使用子查询验证是否真正满足 10 公里的条件。
这样可以避免全表计算距离。
xiangyuecn
2024-03-10 19:10:46 +08:00
mysql 自带空间数据类型 geometry + 空间索引,可以自己研究一下 mysql 文档,查询就直接构造出一个圆面(用合适边数的多边形去近似即可),查出和这个圆面相交坐标点就 ojbk 了,基本上所有数据库通用

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1022313

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX