2011-12-26 66 views
0

我有以下查詢:如何使用嵌套SELECT優化此SQL查詢?

SELECT src_big, created, modified, owner, aid, caption 
FROM photo 
WHERE aid IN (SELECT aid, modified FROM album WHERE owner IN (SELECT uid2 FROM friend WHERE uid1=me() or uid2 = me())order by modified desc) 
ORDER BY created DESC 
LIMIT 30 

它運行很慢,我因爲肯定嵌套查詢的等我怎樣才能讓這個執行更快?應該如何重寫以更好地優化?

回答

1

嘗試使用聯接,而不是子查詢的是速度更快:

SELECT photo.src_big, photo.created, photo.modified, photo.owner, photo.aid, 
photo.caption FROM photo 
inner join album on album.aid = photo.aid 
inner join friend on album.owner = friend.uid2 
WHERE uid1=me() or uid2 = me() 
order by modified desc,created DESC LIMIT 30 

注意:你需要把表名在年底

+0

我唯一的桌子是專輯和朋友正確嗎?我應該如何把它們放在最後? – 2011-12-26 14:50:01

1

我們在我們的Facebook遊戲中有幾個實例需要這種功能,而且我們有很多問題。在mySQL中,似乎外層查詢的每一行都會重新運行嵌套查詢,它將重新運行嵌套在其中的查詢,從而使其非常緩慢。我們發現將內部查詢的結果返回給php,將它連接起來,然後用編譯列表運行下一個查詢的速度非常快。不確定是否有完全在mySQL中的解決方案,但這種解決方案對我們來說工作得很好。

另一個潛在的問題可能是索引編制,您需要確保您正在搜索或排序的所有列都已正確編入索引。使用mySQLs查詢中的解釋功能也有助於發現問題。

0

你可以把它加入

select (stuff) from photo join album 
on photo.aid = album.aid join friend 
on album.owner = friend.uid2 
where friend.uid1 = me() or friend.uid2 = me() 
order by created desc limit 30 

但請注意:由於您正在使用存儲的函數,因此它將永遠不會進入查詢緩存。

通過使用'desc'進行預處理,可以看到發生了什麼事情 - 這將向您展示優化器如何處理它。