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

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

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

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

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

正确的思路是,选择支持地理范围直接查询的数据库,用它做个冗余数据库,专门做地理查询服务就行了,不要为难 MySQL ,很多场景,Mysql 并不适合。
ZoR
253 天前
redis
amon
253 天前
XY 问题,你还是使用 GEO 存储吧
546L5LiK6ZOt
253 天前
之前做过地理位置相关的,经纬度小数点第一位精度是 10 公里左右,数据库按一位小数存经纬度,查询 sql 就变成等值查询了
BeiChuanAlex
253 天前
我在想如果用 postgresql 会不会更好写。
Vegetable
253 天前
@546L5LiK6ZOt 这也太糊弄了,0.9 和 1.1 匹配吗?
mikewang
253 天前
根据坐标和 10 公里的条件,确定极限范围:
A <= 经度 <= B
C <= 纬度 <= D
然后在查到的数据中,使用子查询验证是否真正满足 10 公里的条件。
这样可以避免全表计算距离。
xiangyuecn
253 天前
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