我有一個查詢有一些子查詢(內部選擇),我試着找出哪個更好的性能,更大的查詢或很多較小的查詢,當我的服務器上的所有時間都發生變化時,我發現很難嘗試和計算差異。MYSQL查詢優化,多個查詢或一個大型查詢
我使用下面的查詢一次返回10個結果,以使用分頁(偏移和限制)在我的網站上顯示。
SELECT adverts.*, breed.breed, breed.type, sellers.profile_name, sellers.logo, users.user_level ,
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,
(SELECT advert_images.image_name FROM advert_images WHERE advert_images.advert_id = adverts.advert_id AND advert_images.main = 1 LIMIT 1) as imagename,
(SELECT count(advert_images.advert_id) from advert_images WHERE advert_images.advert_id = adverts.advert_id) AS num_photos
FROM adverts
LEFT JOIN breed ON adverts.breed_id = breed.breed_id
LEFT JOIN sellers ON (adverts.user_id = sellers.user_id)
LEFT JOIN users ON (adverts.user_id = users.user_id)
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
它會更好,從主查詢中刪除低於2個內選擇,然後在我的PHP循環,調用2選擇10次,一次在迴路中的每個記錄?
(SELECT advert_images.image_name FROM advert_images WHERE advert_images.advert_id = adverts.advert_id AND advert_images.main = 1 LIMIT 1) as imagename,
(SELECT count(advert_images.advert_id) from advert_images WHERE advert_images.advert_id = adverts.advert_id) AS num_photos
嗨,謝謝你的詳細解答。我嘗試了你提到的第一種方法,並刪除內部選擇,但查詢比原始文件慢。臨時表聽起來不錯,但是當查詢在服務器上每秒鐘運行約10次時,它可以正常工作,因爲網站非常繁忙? – user1052096
@ user1052096,只要臨時表方法的兩個查詢足夠接近,應該沒有什麼影響。臨時表是連接本地的,所以不會有任何名稱衝突。與第二個查詢結果的許多列相比,「tmp」表的內存消耗應該很小,所以組合的解決方案可能使用的內存少於原始查詢。但我只是有另一個想法,我會立刻編輯成我的答案。 – MvG
嗨MvG,感謝您的更新使用子查詢哪些工作,但我不知道它的更快。如果我只運行子查詢,它會在0.02秒內運行,但是如果我運行子查詢而不選擇advert_id,它將以0.01的速度運行兩次。 – user1052096