私は2つのテーブルを持っていusers
ますfollowers
:
表users
:
id INT, PRIMARY_KEY
name VARCHAR
joined INT
id
このテーブルはおよびで索引付けされていjoined
ます。
テーブル「フォロワー」:
user INT
follows INT
users
このテーブルはおよびで索引付けされていfollows
ます。
このクエリは、特定の時間後に参加した特定のユーザーが後に続くすべてのユーザーの名前を検索します。結果は時系列の逆順にする必要があります。
SELECT u.name
FROM users u, followers f
WHERE f.user = X
AND f.follows = u.id
AND u.joined > 1234
ORDER BY u.joined DESC
ここで、ユーザー X に多数のフォロワーがいる場合、EXPLAIN は次のようになります。
id key extra
-----------------------------------
u joined Using where
f follows Using index
ここまでは順調ですね。('using where' は、簡潔にするために削除した他のいくつかの句によるものです)。
しかし、ユーザー X のフォロワー数が少ない場合は、次のようになります。
id key extra
-----------------------------------
f follows Using temporary, using filesort
u joined Using where
を省略するとORDER BY
、次のようになります。
id key extra
-----------------------------------
f follows
u joined Using where
MySQL オプティマイザーは、処理する必要がある行数を調べているようで、少ない場合は
followers
最初にテーブルを処理します。最適化ステップでを無視しているようORDER BY
で、一時テーブルが原因でクエリが遅くなります。
だから(最後に)、私の質問は次のとおりusing temporary
です。