给定的是一个包含 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 都会发生变化。我怎么可能加快这样的查询?
谢谢。
给定的是一个包含 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 都会发生变化。我怎么可能加快这样的查询?
谢谢。
实际上,您无法优化该查询。
您正在使用计算值对结果进行排序,因此您不能使用索引。如果您使用explain
,您可以看到您的查询是如何执行的,并且using temporary
将出现在extra
列中,这意味着您查询的所有数据都存储在执行排序的临时表中。
如果您只想要查询中的前 50 个匹配项也没关系,它首先要获取所有数据,将其转储到临时表中,对该表中的结果进行排序,然后将前 50 个匹配项返回给您。
如您所想,这是一个耗时且耗费内存的操作。
因此,最好的选择是在表中放置一个索引,以尽可能快地获取所需的所有行,然后对其进行处理php
以获取所需的数据。
顺便说一下,看看MySQL 优化指南。
使 $userParam 的列成为索引,这样查询将执行得更快。或者您可以创建一个索引视图: http: //www.codeproject.com/Articles/199058/SQL-Server-Indexed-Views-Speed-Up-Your-Select-Quer
希望这可以帮助