【问题标题】:Mysql query takes long timeMysql查询需要很长时间
【发布时间】:2015-05-17 12:10:09
【问题描述】:

您好,我有一个包含 500k 记录和以下列的表:

id、id_route、id_point、lat、lng、距离、状态

我想从我定义的点选择半径内的 id_routes。

没问题

SELECT id_route 
FROM route_path
WHERE (((lat < 48.7210 + 2.0869) AND 
        (lat > 48.7210 - 2.0869)) AND 
       ((lng < 21.2578 + 2.0869) AND 
        (lng > 21.2578 - 2.0869))) 
GROUP BY id_route

但根据 PHPmyadmin,它需要 0.2 秒。这非常重要,因为我要构建庞大的查询,而这才刚刚开始。

我也有关于 id_route 的索引。

主键是 id,架构是 MyISAM

选择的解释:

身份证 选择类型 桌子 类型 可能的键 钥匙 key_len 参考 行 额外的

1 简单的 路由路径 全部 空值 空值 空值 空值 506902 使用哪里;使用临时的;使用文件排序

我怎样才能减少时间,我觉得 500K 没有太多的记录来做这么长时间?谢谢

【问题讨论】:

  • 架构是什么?什么的主键?什么是索引?你试过检查计划吗?
  • 请显示 EXPLAIN SELECT 的输出 ...
  • 这是一个不寻常的“径向距离”函数!除了性能优势之外,GROUP BY 主要用于聚合函数。
  • 主键是 id,架构是 MyISAM。
  • @mech EXPLAIN of SELECT: id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE route_path ALL NULL NULL NULL NULL 506902 使用where;使用临时的;使用文件排序

标签: mysql


【解决方案1】:

如果查询需要更长的时间,并且您已经正确设置了索引,那么您需要一个强大的服务器来快速计算查询!

【讨论】:

    【解决方案2】:

    二维搜索本质上很慢。这些工具不会告诉您如何改进此特定查询。

    您的表中似乎没有索引?你至少应该试试INDEX(lat)。这会将努力限制在大约 4 度的条纹(在您的示例中)。这可能包括数千行。然后通过检查lng 消除它们中的大多数,但直到获取所有这些数以千计之后。

    因此,您很想尝试INDEX(lat, lng),却发现它忽略了lng。也许它运行得更慢是因为索引更大。

    INDEX(lat, lng, id) 并使用子查询查找ids,然后将自连接返回到表以完成其余工作,这可能是最简单的半直接解决方案。这有点好处,因为这是子查询的“覆盖索引”,而且,虽然您扫描了 index 中的数千行,但您不必在 data 中获取很多行.

    它可以做得更快吗?是的。但是,复杂性超出了此处可用的空间。见Find the nearest 10 pizza parlors。它涉及 InnoDB(获取索引集群)、PARTITION(作为粗略的 2D 索引)和对原始数据的修改(将 lat/lng 转换为 PARTITION 键的整数)。

    【讨论】:

      【解决方案3】:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-14
        • 1970-01-01
        相关资源
        最近更新 更多