2012-09-30 58 views
1

我在下面查詢的速度很慢,我知道可以優化。它需要0.0479秒,但這是因爲它在計算字段上排序。在select語句中,我選擇了表格的主鍵advert_id列。如果我贊成下面的查詢,不要選擇advert_id的主鍵,但保持其他所有內容相同,只需要0.0098秒的時間運行。針對慢查詢的MYSQL查詢優化

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 

在第一次查詢時,解釋說是使用下面的「自主學習」指數,但額外的科拉姆被設置爲「使用地方;使用filesort'。

當我建議查詢不選擇advert_id時,解釋說它使用'sall'索引,但額外的列設置爲'Using where;使用索引;使用filesort'。

的「自主學習」指標包括下列欄目:

狀態 批准 緯度 經度

我試圖創建另一個指標,但是狀態之前添加advert_id,希望第一個查詢將使用這一點,速度更快,但是當我強迫它使用索引時,速度更慢。

+0

'HAVING'子句僅適用於包含GROUP BY子句的查詢的聚合函數結果(也許MySQL在這方面比Oracle更寬鬆) - 距離測試應該是WHERE的一部分條款。 –

回答

2

將advert_id添加到索引的末尾,而不是開頭。

這將允許僅使用索引處理查詢(這是「使用索引」的意思),但不會中斷索引已經提供的高效搜索。另外,正如Jim Garrison所指出的那樣,您可能應該在HAVING子句之前將「GROUP BY adverts.advert_id」添加到您的查詢中。

+0

謝謝,這工作。 – user1052096