2011-12-18 48 views
1

學習MySQL(innodb)我試圖用3個表編寫一個twitter應用程序:users2,follow2和tweets2。MySQL優化 - 遍歷WHERE foo IN子選擇的整個表?

做一個解釋如下顯示可能被觸摸的tweets2中的所有行。這是否準確?如果你打算做一個WHERE用戶名IN(select),我會假定給定的用戶名是索引的。MySQL將檢索子選擇子句並直接轉到tweets2中有這些用戶名的行。

explain select username, timestamp, tweet 
from tweets2 
where username in 
    (select followee from follow2 where follower='user1') 
order by timestamp desc; 

繼承人的SQLAlchemy的代碼創建表:

users = Table('users2', metadata, 
    Column('username', String(16), index=True), 
    Column('email', String(256)), 
    ) 
    follow = Table('follow2', metadata, 
    Column('follower', String(16), index=True), 
    Column('followee', String(16), index=True), 
    ) 
    tweets = Table('tweets2', metadata, 
    Column('id', Integer, primary_key=True), 
    Column('username', String(16), index=True), 
    Column('timestamp', BigInteger), 
    Column('tweet', String(200)), 
    ) 

回答

2

MySQL,將IN子句中的select語句總是被驅動(雖然指數仍可能在其上使用)。

JOIN替換爲:

SELECT username, timestamp, tweet 
FROM follow2 f 
JOIN tweets2 t 
ON  t.username = f.followee 
WHERE f.follower = 'user1' 
ORDER BY 
     timestamp DESC