簡體   English   中英

MySQL慢速SELECT查詢

[英]MySQL Slow SELECT Query

我有一個查詢,類似於以下內容:

SELECT * FROM table1
WHERE confirmed = 0
AND resource = 123
AND id IN (
  SELECT id FROM table2 WHERE resource = 123
  AND added > 1440000000
)

運行大約需要3分鍾,但我不知道為什么。 這就是為什么我感到困惑的原因...

SELECT id FROM table2 WHERE resource = 123
AND added > 1440000000

沒有該子查詢的結果。 沒有一個。 所以,我想如果我這樣做:

SELECT * FROM table1
WHERE confirmed = 0
AND resource = 123
AND id IN (
 0
)

運行大約需要相同的時間。 除非沒有,否則它會立即按預期返回0個結果。 這是怎么回事? 將空查詢結果與0進行比較有何不同?

行號也很低。 我已經做了一個解釋,它使用的是表1的確認鍵和表2的主鍵。行數分別為5500/20000。

任何想法將不勝感激! 謝謝!

使用顯式join查詢將運行得更快。 如果子查詢未返回重復值:

SELECT t1.*
FROM table1 t1 JOIN
     (SELECT id FROM table2 WHERE resource = 123 AND added > 1440000000
     ) t2
     ON t1.id = t2.id
WHERE confirmed = 0 AND resource = 123;

另外,MySQL通常可以更好地優化NOT EXISTS

SELECT t1.*
FROM table1 t1
WHERE confirmed = 0 AND resource = 123 AND
      NOT EXISTS (SELECT 1
                  FROM table2 t2
                  WHERE t2.id = t1.id AND t2.resource = 123 AND t2.added > 1440000000
                 );

使用table2(id, resource, added)上的索引,此查詢將運行得更快。

IN ( SELECT ... )在5.6之前的優化效果很差。 5.6更好,但仍然不是很好。

JOIN ( SELECT ... )必須首先計算,並且需要一個臨時表。 因此,它不如下面的普通聯接那么好。

SELECT  *
    FROM  table1 AS t1
    JOIN  table2 AS t2 ON t2.id = t1.id
    WHERE  t1.confirmed = 0
      AND  t1.resource = 123
      AND  t2.resource = 123
      AND  t2.added > 1440000000 

並有

table2:  INDEX(resource, added)
table1:  INDEX(resource, confirmed)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM