V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Angela2022
V2EX  ›  程序员

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

  •  
  •   Angela2022 · Mar 10, 2024 · 18235 views
    This topic created in 783 days ago, the information mentioned may be changed or developed.
    我有 MYSQL 表含 20 万条记录, 每条记录有店铺和位置经纬度字段. 现在我用 sql 查询距离指定坐标半径 10 公里内的所有店铺, 发现查询速度奇慢, 做了 index 后也是如此.

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

    谢谢
    108 replies    2025-10-27 15:26:24 +08:00
    1  2  
    yjhatfdu2
        101
    yjhatfdu2  
       Mar 12, 2024
    @249239432 你估计没排序吧,你这算法复杂度有点高排个序应该就是 ONLogN 了
    249239432
        102
    249239432  
       Mar 12, 2024
    @yjhatfdu2 计算次数就摆在那里,还有一天内要跑完,才用集群跑的
    op 的问题,还是 postgis 啊,redis 啊这种比较合适
    yjhatfdu2
        103
    yjhatfdu2  
       Mar 12, 2024
    @249239432 计算次数和算法是很有关的,比如你要圈每一个点附近 50 米的所有点,你可以两次 for 循环每两个之间算一次,也可以排序/索引之后,每个点只需要用 LogN 次查询
    249239432
        104
    249239432  
       Mar 12, 2024
    @yjhatfdu2 改成用 sql 就是这么算的,计算某个点附近 50 米有没有,但是要跑 600 万数据,还是不行
    有现成的集群当然用集群了
    yjhatfdu2
        105
    yjhatfdu2  
       Mar 13, 2024
    @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  
       Mar 13, 2024
    @yjhatfdu2 更正:50 米内点的数量
    249239432
        107
    249239432  
       Mar 14, 2024
    @yjhatfdu2 那我还能说啥,postgis 牛逼
    opengps
        108
    opengps  
       Oct 27, 2025
    我当年用过一楼的方法,因为按照纬度,1 度 111km ,确实可以轻松做到
    1  2  
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2419 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 15:35 · PVG 23:35 · LAX 08:35 · JFK 11:35
    ♥ Do have faith in what you're doing.