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

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

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

谢谢
15613 次点击
所在节点    程序员
107 条回复
yjhatfdu2
2024-03-12 10:30:45 +08:00
@249239432 你估计没排序吧,你这算法复杂度有点高排个序应该就是 ONLogN 了
249239432
2024-03-12 10:54:09 +08:00
@yjhatfdu2 计算次数就摆在那里,还有一天内要跑完,才用集群跑的
op 的问题,还是 postgis 啊,redis 啊这种比较合适
yjhatfdu2
2024-03-12 10:58:19 +08:00
@249239432 计算次数和算法是很有关的,比如你要圈每一个点附近 50 米的所有点,你可以两次 for 循环每两个之间算一次,也可以排序/索引之后,每个点只需要用 LogN 次查询
249239432
2024-03-12 11:44:01 +08:00
@yjhatfdu2 改成用 sql 就是这么算的,计算某个点附近 50 米有没有,但是要跑 600 万数据,还是不行
有现成的集群当然用集群了
yjhatfdu2
2024-03-13 10:25:40 +08:00
@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-03-13 10:26:45 +08:00
@yjhatfdu2 更正:50 米内点的数量
249239432
2024-03-14 15:16:30 +08:00
@yjhatfdu2 那我还能说啥,postgis 牛逼

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

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

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

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

© 2021 V2EX