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

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

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

谢谢
15610 次点击
所在节点    程序员
107 条回复
lambdaq
2024-03-11 14:30:02 +08:00
20 万条记录 。。。直接 where 经度 between a and b AND 纬度 between c AND d 然后拿到数据,代码里 Haversine 一把梭吧。。

啥时候 1000w 以上的数据再用各种 geo 库吧。
xz410236056
2024-03-11 14:38:57 +08:00
@xmumiffy #75 严格来说,应该是个球面(甚至除以余弦的方式也不严谨,地球又不是个球。应该用 Vincenty ),在空间中找个平面图形,误差会很大。经纬度中每度的距离并不是固定的,尤其是精度,会随着纬度变化而变化。有的地方会是个 22*22 的矩形(赤道)越靠近极点越小,这样就会有很多冗余数据和漏掉很多数据。
mxT52CRuqR6o5
2024-03-11 14:54:43 +08:00
啥 geo 索引相关的知识都不知道,就拿集群搁那儿硬算 5 个小时,还觉得自己可牛逼了😅
xmumiffy
2024-03-11 15:01:47 +08:00
@xz410236056
公里级精度不用考虑地球不是球的问题. 10 公里级也可以忽略在球面上取平面的误差.
#10 补充了经度需要除纬度的余弦
yh7gdiaYW
2024-03-11 15:09:16 +08:00
数据导入 MongoDB ,$geoWithin ,完事儿
249239432
2024-03-11 16:33:02 +08:00
@yjhatfdu2 没说清楚需求,600 万数据是要互相跟其他所有数据计算的,也就大概是 600 / 2 * ( 600 - 0.001 ) 万次查询,需要大量 cpu 资源
shadowyue
2024-03-11 16:35:57 +08:00
@yjhatfdu2 🤣3 亿倍也太强了,老哥。来一发都不一定有 3 亿。
macttt
2024-03-11 16:46:59 +08:00
lambdaq
2024-03-11 16:47:16 +08:00
@xz410236056 好像是个椭球。高纬度地区是扁的。。
macttt
2024-03-11 16:47:20 +08:00
@macttt 美团有一篇文章可以参考,使用的 ES:https://tech.meituan.com/2022/11/17/elasicsearch-optimization-practice-based-on-run-length-encoding.html ,我觉得用传统数据结构不太可行噢
zhouxiyu
2024-03-11 16:50:33 +08:00
还是用地理数据库吧
jackerbauer
2024-03-11 17:03:00 +08:00
每个店铺生成一个 geohash ,然后根据 geohash 找到一个点周围的店铺

https://zhuanlan.zhihu.com/p/35940647
mxT52CRuqR6o5
2024-03-11 17:07:35 +08:00
@lyz1990 #76 那个人到处传播错误知识还不自知得 diss 几句呀,不然别人信了学了去了可害人啊
lijin7516
2024-03-11 17:27:08 +08:00
我觉得大家讨论的非常精彩,笑出了猪叫声
romisanic
2024-03-11 17:27:12 +08:00
拿空间换时间
况且你这点数据也用不了多少控件
ynxh
2024-03-11 17:35:22 +08:00
好问题
jimrok
2024-03-11 17:42:40 +08:00
欧式距离可能会容易算一些,曼哈顿距离可能体验更好,如果是欧式距离,可以先把地图分割成区域,再通过 10 公里的半径计算一下有那些区域落入,把这些区域里面商户列出,优先中心区域,其他边缘区域的需要二次筛查,稍微耗费一些计算。
Rickkkkkkk
2024-03-11 17:44:33 +08:00
技术方案选型就被打回了...老老实实用 redis 吧.
mmdsun
2024-03-12 08:21:29 +08:00
“现在我用 sql 查询距离指定坐标半径 10 公里内的所有店铺, 发现查询速度奇慢。” op 贴下关键 SQL 看看,才 20 万不会慢的
cherishfall
2024-03-12 09:59:43 +08:00
美团技术-地理空间距离计算优化 https://tech.meituan.com/2014/09/05/lucene-distance.html 这篇博客应该是博主需要的。
现在我的做法(数据量较小)是在 mysql 创建一个 haversine 方法计算距离的函数,然后传入就好了。

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

https://ex.noerr.eu.org/t/1022313

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

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

© 2021 V2EX