V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Angela2022
V2EX  ›  程序员

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

  •  
  •   Angela2022 · 58 天前 · 8806 次点击
    这是一个创建于 58 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我有 MYSQL 表含 20 万条记录, 每条记录有店铺和位置经纬度字段. 现在我用 sql 查询距离指定坐标半径 10 公里内的所有店铺, 发现查询速度奇慢, 做了 index 后也是如此.

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

    谢谢
    107 条回复    2024-03-14 15:16:30 +08:00
    1  2  
    yjhatfdu2
        101
    yjhatfdu2  
       57 天前
    @249239432 你估计没排序吧,你这算法复杂度有点高排个序应该就是 ONLogN 了
    249239432
        102
    249239432  
       57 天前
    @yjhatfdu2 计算次数就摆在那里,还有一天内要跑完,才用集群跑的
    op 的问题,还是 postgis 啊,redis 啊这种比较合适
    yjhatfdu2
        103
    yjhatfdu2  
       57 天前
    @249239432 计算次数和算法是很有关的,比如你要圈每一个点附近 50 米的所有点,你可以两次 for 循环每两个之间算一次,也可以排序/索引之后,每个点只需要用 LogN 次查询
    249239432
        104
    249239432  
       57 天前
    @yjhatfdu2 改成用 sql 就是这么算的,计算某个点附近 50 米有没有,但是要跑 600 万数据,还是不行
    有现成的集群当然用集群了
    yjhatfdu2
        105
    yjhatfdu2  
       56 天前
    @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
        106
    yjhatfdu2  
       56 天前
    @yjhatfdu2 更正:50 米内点的数量
    249239432
        107
    249239432  
       55 天前
    @yjhatfdu2 那我还能说啥,postgis 牛逼
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5674 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 07:47 · PVG 15:47 · LAX 00:47 · JFK 03:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.