在计算列上订购时的MySQL性能

时间:2013-03-08 14:30:31

标签: mysql performance

给出的是一张包含300,000个测试记录的表格。

我需要选择这样的选择:

SELECT (SQRT(POWER(ABS(posts.latitude-$lat),2)+POWER(ABS(posts.longitude-$lng),2))) AS distance
FROM table
ORDER BY distance
LIMIT 0,50

其中$ lat和$ lng为每个请求更改。 我怎么可能加快这样的查询?

感谢。

2 个答案:

答案 0 :(得分:0)

实际上你无法优化该查询。

您正在使用计算值对结果进行排序,因此您无法使用索引。如果您使用explain,则可以看到查询的执行方式,using temporary列中将显示extra,这意味着您查询中的所有数据都存储在执行排序的临时表。

如果您只想查询查询中的前50个匹配项并不重要,它首先获取所有数据,将其转储到临时表中,对该表中的结果进行排序,然后返回前50个匹配。

正如您可以想象的那样,这是一个耗费时间和内存的操作。

因此,您最好选择在表中放置一个索引,以尽可能快地获取所需的所有行,然后使用php处理它们以获取所需的数据。

顺便说一句,看看MySQL optimization guide

答案 1 :(得分:-1)

使$ userParam的列成为索引,这样查询的执行速度会更快。 或者您可以创建索引视图:http://www.codeproject.com/Articles/199058/SQL-Server-Indexed-Views-Speed-Up-Your-Select-Quer

希望这有帮助