1

我在下面有一个查询很慢,我知道可以优化。它需要 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' 索引,但额外的列设置为 'Using where; 使用文件排序'。

当我修改查询以不选择 advert_id 时,解释说它使用“sall”索引,但额外的列设置为“使用 where;使用索引;使用文件排序'。

'sall' 索引包括以下列:

状态 批准 纬度 经度

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

4

1 回答 1

2

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

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

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

于 2012-09-30T23:01:35.103 回答