2011-10-24 14 views
2

此查詢需要分裂第二MySQL的 - 其中使100%的CPU也沒有結果

select * from tbl1 limit 0,1 

此查詢需要第二

SELECT Distinct(col2) FROM tbl2 WHERE col3 = 2 

此查詢吃100%的CPU和需要190秒持續時間(0s取)返回結果

select * from tbl1 WHERE ID IN (SELECT Distinct(col2) FROM tbl2 WHERE col3 = 2) limit 0,1 

我想在完整的數據集上運行此查詢(不僅限於一個記錄)

什麼可能導致性能問題,我的表結構?

+0

多少條記錄在TBL1? – Trevor

+0

你有'tbl2.col3'上的索引嗎? –

+0

24千條記錄 – Chris

回答

3

MySQL中的子查詢速度很慢。您可以通過加入加速此:

SELECT A.* 
FROM 
    tbl1 A 
    INNER JOIN (
     SELECT DISTINCT col2 
     FROM 
      tbl2 
     WHERE 
      col3 = 2 
    ) X ON X.col2 = A.ID 
LIMIT 0, 1 

要更新tbl1

UPDATE 
    tbl1 A 
    INNER JOIN (
     SELECT DISTINCT col2 
     FROM 
      tbl2 
     WHERE 
      col3 = 2 
    ) X ON X.col2 = A.ID 
SET 
    A.SomeCol = 'value' 
+0

感謝肖恩,我一直在使用select來試圖找出需要多長時間才能使用我的方法選擇一行,但我真的需要做大規模更新,是否有可能在更新中使用連接方法? – Chris

+0

假設'tbl1.ID'是唯一的或PK,那麼這是正確的。 –

+0

Chris,假設你想更新tbl1上的一列。我會更新我的例子。 –

0

tbl2(col3,col2)添加一個索引,在col3或(甚至更好)。

然後用這個(無需對DISTINCT這裏):

SELECT * 
FROM tbl1 
WHERE ID IN (SELECT col2 FROM tbl2 WHERE col3 = 2) 
LIMIT 0,1 

,甚至更好,避免IN (SELECT ...),這個版本:

SELECT * 
FROM tbl1 t 
WHERE EXISTS 
     (SELECT * 
     FROM tbl2 t2 
     WHERE t2.col3 = 2 
      AND t2.col2 = t.ID 
    ) 
LIMIT 0,1