2011-12-18 7 views
1

MySQL(innodb)を学ぶために、users2、follow2、およびtweets2という3つのテーブルを持つTwitterアプリを作成しようとしています。MySQLの最適化 - WHERE foo INサブ選択用のテーブル全体をトラバースしますか?

次のように説明すると、tweets2のすべての行がタッチされる可能性があります。これは正確ですか? WHERE username IN(select)を行うつもりなら、与えられたユーザ名がインデックスに登録されていると仮定します。MySQLはsub-select節を取得し、それらのユーザ名を持つtweets2の行に直接行きます。

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

テーブルを作成SQLAlchemyのコード:MySQL

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

(インデックスはまだそれに使用してもよい)、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 
関連する問題