用于慢查询的MYSQL查询优化

时间:2012-09-30 20:09:22

标签: mysql optimization indexing query-optimization

我在下面有一个查询很慢,我知道可以选择。它需要0.0479秒,但这是因为它在计算字段上排序。在select语句中,我选择advert_id列,它是表的主键。如果我推荐下面的查询,不要选择advert_id的主键,但保留其他所有内容,只需要0.0098秒即可运行。

SELECT adverts.advert_id, round( sqrt( ( ( (adverts.latitude - '51.558430') * (adverts.latitude - '51.558430') ) * 69.1 * 69.1 ) + ( (adverts.longitude - '-0.0069345') * (adverts.longitude - '-0.0069345') * 53 * 53 ) ), 1 ) as distance
FROM adverts
WHERE (adverts.status = 1) AND (adverts.approved = 1) 
AND (adverts.latitude BETWEEN 51.2692837281 AND 51.8475762719) 
AND (adverts.longitude BETWEEN -0.472015213613 AND 0.458146213613) 
having (distance <= '20') 
ORDER BY distance ASC 
LIMIT 0,10

在第一个查询中,解释说是使用下面的'sall'索引,但是额外的colum设置为'Using where;使用filesort'。

当我推荐查询不选择advert_id时,解释说它使用'sall'索引但是额外列设置为'使用where;使用索引;使用filesort'。

'sall'索引包括以下列:

状态 批准 纬度 经度

我尝试创建另一个索引,但在状态之前添加了advert_id,希望第一个查询会使用它并且更快,但是当我强制它使用索引时,它甚至更慢。

1 个答案:

答案 0 :(得分:2)

将ads_id添加到索引的末尾,而不是开头。

这将允许仅使用索引处理查询(这是“使用索引”的意思)但不会破坏索引已经提供的有效搜索。

另外,正如Jim Garrison指出的那样,您可能应该在HAVING子句之前将“GROUP BY adverts.advert_id”添加到您的查询中。