我在下面查詢的速度很慢,我知道可以優化。它需要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,希望第一個查詢將使用這一點,速度更快,但是當我強迫它使用索引時,速度更慢。
'HAVING'子句僅適用於包含GROUP BY子句的查詢的聚合函數結果(也許MySQL在這方面比Oracle更寬鬆) - 距離測試應該是WHERE的一部分條款。 –