给出的是一张包含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为每个请求更改。 我怎么可能加快这样的查询?
感谢。
答案 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
希望这有帮助