2017-06-16 10 views
0

MySQLのサブクエリ巨大なテーブルでは非常に遅い

SELECT o_id, someColumn... FROM link_table WHERE s_id = 1 and o_id IN 
(SELECT s_id FROM link_table WHERE o_id=2) 

このSQLクエリはintermediate_id特定のS_IDとo_idの間に接続された見つけることですが、非常に遅いようです。約10秒かかる。

link_tableは

(40M行を持つ)巨大です誰も私を助けることができますか?おかげさまで

答えて

0

はこれを試してみてください。私の経験1としてをEXISTS IN 以上のパフォーマンスが向上しますCluase

SELECT o_id, someColumn... 
FROM link_table t1 
WHERE s_id = 1 and EXISTS (SELECT 1 
          FROM link_table t2 
          WHERE t2.s_id=t1.o_id AND t2.o_id=2) 
0

自己が参加してみてください:::

SELECT o_id, someColumn... FROM 
link_table A, link_table b 
WHERE a.s_id = 1 AND 
a.o_id=b.s_id AND 
b.o_id=2 
0

新しいを使用している場合JOIN機能を使用すると、元のクエリよりも優れたパフォーマンスを発揮し、読みやすくなります

SELECT l1.o_id, someColumn... 
    FROM link_table l1 
    JOIN link_table l2 on l1.o_id = l2.s_id 
    WHERE l1.s_id = 1 
      and l2.o_id = 2 

インデックスがあることを確認し、EXPLAINを使用すると、使用されているインデックスが表示されます。

+0

サブクエリはJOINよりも新しいか、ジョークを作成したばかりか – Strawberry

+0

そして 'INDEX(o_id、s_id)' –

関連する問題