タイトインデックススキャンは、クエリー条件によって、フルインデックススキャンまたはレンジインデックススキャンのいずれかとなります。
ルースインデックススキャンの条件が満たされていなくても、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;