[英]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.