mysql选择的查询时间慢

时间:2012-05-30 04:52:56

标签: mysql performance latitude-longitude

我对MySQL和数据库一般都很新,但我的查询似乎需要很长时间。我使用lat和lon坐标从位置数据库中找到位于距离另一个位置5英里范围内的位置数据库中的位置。问题是,查询需要2.12秒,我担心一旦开始获得流量,MySQL就会堵塞。这是我的代码:

SELECT *,((ACOS(SIN(44.4726 * PI() / 180) * SIN(lat * PI() / 180) + COS(44.4726 * PI() /          180) * COS(lat * PI() / 180) * COS((-93.1785 - lon) * PI() / 180)) * 180 / PI()) * 60 *   1.1515) AS distance FROM locations HAVING distance<=5 ORDER BY distance ASC LIMIT 30;

我将lat和lon字段编入索引,但仍需要很长时间。这是我要求服务器做的事情吗?我可以通过添加

来加快速度
WHERE state = "$state"

如果是这样,我会在Select中添加哪个?

3 个答案:

答案 0 :(得分:1)

该查询将seq扫描整个表,因为它上面没有一个过滤器,它不是从计算值(距离)派生的。添加一个由索引列过滤的where子句肯定有助于消除一些开销,但前提是数据库认为表中有足够的数据来保证使用索引而不是表。因此,请确保您也进行分析。

距离在查询中的逻辑非常难看,但我可以看到为什么每次从表中选择时都不希望在线上传输700k +行。看起来您可能正在进行空间计算,并且调查空间数据类型和索引可能是明智的。

Ed:另外,关于where子句的问题......

select fields [aggregate fields]
from table
where where clause
group by fields
having having clause

答案 1 :(得分:0)

为什么要在查询中进行计算?这样的逻辑不应该在DAL中。

我建议只获取你需要的列,然后在你的代码中进行计算,这样你就可以只计算没有lat和long一次的部分(例如SIN(44.4726 * PI()/ 180)) ,然后只需循环结果并在适当的时候添加lat和。

答案 2 :(得分:0)

我不知道这种查询通常是如何进行的,所以请随意忽略我的建议,但假设你的应用程序要接受输入{lat,lon}并将其向每个方向扩展5英里(北,东,南,西)。然后,您的查询只能选择那些在上限和下限之间具有lat和long的记录。

您仍然需要进行距离计算,但是您将删除无法匹配的记录,因此,您应该减少查询的开销。此外,如果你有lat和long的索引,那么mysql应该可以使用它们。

我可能误解了几何形状,正如我所说,我没有该领域的经验,但它可能是对其他建议的有用优化。