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

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

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

谢谢
18236 次点击
所在节点    程序员
108 条回复
yjhatfdu2
2024 年 3 月 12 日
@249239432 你估计没排序吧,你这算法复杂度有点高排个序应该就是 ONLogN 了
249239432
2024 年 3 月 12 日
@yjhatfdu2 计算次数就摆在那里,还有一天内要跑完,才用集群跑的
op 的问题,还是 postgis 啊,redis 啊这种比较合适
yjhatfdu2
2024 年 3 月 12 日
@249239432 计算次数和算法是很有关的,比如你要圈每一个点附近 50 米的所有点,你可以两次 for 循环每两个之间算一次,也可以排序/索引之后,每个点只需要用 LogN 次查询
249239432
2024 年 3 月 12 日
@yjhatfdu2 改成用 sql 就是这么算的,计算某个点附近 50 米有没有,但是要跑 600 万数据,还是不行
有现成的集群当然用集群了
yjhatfdu2
2024 年 3 月 13 日
@249239432 我单机 pg 查了 1000w 个点,每个点附近 50 个点的数量(平均 5 个左右)也就 20 分钟
explain analyse select id,(select count(*) from geo where st_dwithin(point,g.point,50)) from geo g;
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------
Seq Scan on geo g (cost=0.00..165365708334.00 rows=10000000 width=12) (actual time=1.076..1049434.731 rows=10000000 loops=1)
SubPlan 1
-> Aggregate (cost=16536.54..16536.55 rows=1 width=8) (actual time=0.105..0.105 rows=1 loops=10000000)
-> Index Scan using geo_point_idx on geo (cost=0.54..16534.04 rows=1000 width=0) (actual time=0.027..0.104 rows=14 loops=10000000)
Index Cond: (point && _st_expand(g.point, '50'::double precision))
Filter: st_dwithin(point, g.point, '50'::double precision, true)
Rows Removed by Filter: 7
Planning Time: 0.756 ms
Execution Time: 1049626.246 ms
(9 rows)

Time: 1049627.962 ms (17:29.628)
yjhatfdu2
2024 年 3 月 13 日
@yjhatfdu2 更正:50 米内点的数量
249239432
2024 年 3 月 14 日
@yjhatfdu2 那我还能说啥,postgis 牛逼
opengps
2025 年 10 月 27 日
我当年用过一楼的方法,因为按照纬度,1 度 111km ,确实可以轻松做到

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

https://study.congcong.us/t/1022313

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

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

© 2021 V2EX