タイトインデックススキャンは、クエリ条件によって、フルインデックススキャンもしくはレンジインデックススキャンのいずれかとなります。
ルースインデックスに見合う条件がなければ、GROUP
BY
クエリの一時的なテーブル作成は拒否できます。WHERE
節にレンジ条件がある場合、このメソッドはこれらの条件を満たすキーだけを読みます。もしくは、インデックススキャンとして実行されます。この方法はWHERE
節に定義された各レンジ内の全てのキーを読むか、もしくはレンジ条件がなければ全てのインデックスをスキャンするため、タイトインデックススキャンと呼ばれています。レンジ条件を満たす全てのキーが認識された後でのみ、タイトインデックススキャンを用いてグループ演算が実行されることに注意してください。
このメソッドを起動させるには、クエリ内にある全てのカラムに対する定数同等条件があれば十分です。ここでいうクエリとは、GROUP
BY
キーの前もしくは間にくるキー部分を参照するものです。同等条件の定数は検索キーの「ギャップ」を埋めるため、インデックスの完全なプレフィックスを形成できます。これらインデックスのプレフィックスは、インデックスルックアップに使用できます。GROUP
BY
結果のソートを要求した場合、またはインデックスのプレフィックスである検索キーを形成できる場合、MySQLもまた余分なオペレーションのソートを拒否します。これは、すでに整頓されたインデックス内でプレフィックスを用いて探索することは、全てのキーを順番に検索することになるからです。
以下のクエリは、前述のルースインデックススキャンアクセス方法では機能しません。しかし、タイトインデックススキャンアクセス方法(テーブルt1(c1,c2,c3,c4)
上にインデックスidx(c1,c2,c3)
があると仮定する)では、機能します。
GROUP
BY
にはギャップがありますが、条件c2
=
'a'
によってカバーされます。
SELECT c1, c2, c3 FROM t1 WHERE c2 = 'a' GROUP BY c1, c3;
GROUP
BY
は、キーの最初の部分では開始されませんが、その部分に対してある定数を与える条件があります。
SELECT c1, c2, c3 FROM t1 WHERE c1 = 'a' GROUP BY c2, c3;