2017-06-16 75 views
0

很慢我有一個SQL查詢是這樣的: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

試試這個:按我的經驗EXISTS給出了更好的性能 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)'' –