2017-09-22 21 views
0

想像這樣MySQL是否足夠智能,一旦HAVING條件必須爲真就停止考慮行?

SELECT col1 
FROM t 
GROUP BY col2 
HAVING COUNT(col3) > 1; 

查詢那裏的COL2上一個可用的索引。當MySQL掃描col2索引並計算COUNT(col3)時,它會在計數超過1時立即停止計數,並向前掃描到下一個唯一的col2值?或者它會考慮每一行並得到一個準確的計數,然後將它與1進行比較,一旦完成了彙總?

回答

4

這是通知投機。當HAVING條款爲真時,MySQL不夠智能停止。爲什麼?因爲MySQL首先執行GROUP BY,然後執行ORDER BY。據我所知,它不會將過濾推入聚合步驟 - 即使使用索引。

讓我們忽略SELECT col1,這在這個查詢中沒有意義。

如果col2 /col3對是唯一的,那麼你可能會得到更好的性能:

SELECT col1 
FROM t 
WHERE EXISTS (SELECT 1 
       FROM t t2 
       WHERE t2.col2 = t.col2 AND t2.col3 <> t.col3 
      ); 

這將停在第一排col3匹配。如果情況是,你真的檢查的col3NULL值,則:

SELECT col1 
FROM t 
WHERE EXISTS (SELECT 1 
       FROM t t2 
       WHERE t2.col2 = t.col2 AND t2.col3 IS NOT NULL AND t2.id <> t.id 
      ) AND 
     col3 IS NOT NULL; 

後兩個查詢,假設你有t(col2, col3)的索引。

相關問題