3

给定的是一个包含 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 都会发生变化。我怎么可能加快这样的查询?

谢谢。

4

2 回答 2

1

实际上,您无法优化该查询。

您正在使用计算值对结果进行排序,因此您不能使用索引。如果您使用explain,您可以看到您的查询是如何执行的,并且using temporary将出现在extra列中,这意味着您查询的所有数据都存储在执行排序的临时表中。

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

如您所想,这是一个耗时且耗费内存的操作。

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

顺便说一下,看看MySQL 优化指南

于 2013-03-09T14:14:27.033 回答
-1

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

希望这可以帮助

于 2013-03-08T14:38:20.493 回答