Mysql查询需要很长时间

时间:2015-03-15 08:51:12

标签: mysql

您好我有500k记录和下列列表:

id,id_route,id_point,lat,lng,distance,status

我想从我定义的点中选择半径范围内的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

SELECT的解析:

ID SELECT_TYPE 表 类型 possible_keys 键 key_len REF 行 额外

1 简单 route_path 所有 空值 空值 空值 空值 506902 用在哪里;使用临时;使用filesort

我怎样才能减少时间,我认为500K这么长时间的记录不是很多?感谢

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

你的表似乎没有索引?你应该至少尝试INDEX(lat)。这将把工作量限制在大约4度的条纹(在你的例子中)。这可能包括数千行。然后通过检查lng来消除它们中的大多数,但是直到取出所有这些数千个之后才消除它们。

所以,你很想尝试INDEX(lat, lng),却发现它忽略了lng。也许它运行速度较慢,因为索引更大。

INDEX(lat, lng, id)并使用子查询查找id,然后执行自联接返回表以完成其余工作可能是最简单的半直接解决方案。这略微有益,因为这是一个覆盖索引&#34;对于子查询,虽然您在索引中扫描了数千行,但您不必在数据中获取许多行。

可以加快速度吗?是。但是,复杂性超出了这里的可用空间。见Find the nearest 10 pizza parlors。它涉及InnoDB(获取索引聚类),PARTITIONs(粗略的2D索引)和对原始数据的修改(将lat / lng转换为PARTITION键的整数)。

答案 2 :(得分:0)