给出了一个包含 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 根据每个请求而变化。
我怎样才能加快此类查询的速度?
Thanks.
实际上你无法优化该查询。
您正在使用计算值对结果进行排序,因此无法使用索引。如果你使用explain
您可以看到查询是如何执行的,并且using temporary
将出现在extra
列,这意味着查询中的所有数据都存储在执行排序的临时表中。
如果您只想要查询中的前 50 个匹配项,也没关系,它必须首先获取所有数据,将其转储到临时表中,对该表中的结果进行排序,然后将前 50 个匹配项返回给您。
正如您所想象的,这是一个消耗时间和内存的操作。
因此,最好的选择是在表中放置一个索引,以尽可能快地获取所需的所有行,然后使用php
获取您需要的数据。
顺便说一下,看看MySQL优化指南.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)