2017-09-22 1 views
0

はCOL2に使用可能なインデックスがありますMySQLは、いったん条件を満たす必要があると、行の検討を中止するほどスマートですか?

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

ようなクエリを想像してみてください。 MySQLがcol2インデックスをスキャンしてCOUNT(col3)を計算すると、カウントが1を超えたら直ちにカウントを停止し、次の一意のcol2値にスキャンしますか?それとも、すべての行を考慮し、正確なカウントを取得し、一度それが完全に集計されたら1と比較しますか?

答えて

4

これは情報に基づく推測です。 MySQLは、HAVING句がtrueのときに停止するほどスマートではありません。どうして? 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; 

これらの後者の2つのクエリを使用すると、t(col2, col3)にインデックスを持っていると仮定します。

関連する問題