複合パートインデックスのレンジ条件はシングルパートインデックスのレンジ条件の拡張です。複合パートインデックスのレンジ条件はインデックス行が1つもしくは複数のキータプルインターバルに含まれるよう制限します。キータプルインターバルはキータプルセット上で、インデックスからの順序づけを使用して定義されます。
例えば、複合パートインデックスがkey1(として定義され、以下のキータプルのセットがキー順序でリストされたとします。
key_part1、key_part2、key_part3)
key_part1key_part2key_part3NULL 1 'abc' NULL 1 'xyz' NULL 2 'foo' 1 1 'abc' 1 1 'xyz' 1 2 'abc' 2 1 'aaa'
の条件は以下のインターバルを定義します。
key_part1 =
1
(1,-inf,-inf) <= (key_part1,key_part2,key_part3) < (1,+inf,+inf)
インターバルは前データセットの4、5、そして6番目タプルをカバーし、レンジアクセスメソッドで使用できます。
それに引き換え、条件はシングルインターバルを定義せず、レンジアクセスメソッドで使用できません。
key_part3
=
'abc'
以下はレンジ条件が複合パートインデックスでどのように働くかの詳細を説明します。
HASHインデックスでは、同値を含む各インターバルが使用できます。これは以下のフォームをとる条件のためのみインターバルが生成できることを意味してます。
key_part1cmpconst1ANDkey_part2cmpconst2AND ... ANDkey_partNcmpconstN;
ここでは、const1、const2、…
は定数で、cmp
は=、<=>、またはIS
NULL比較演算子の1つであり、条件は全てのインデックスパートをカバーします。(つまり、N条件があり、各N-パートインデックスごとに1つあります。.)例えば、以下は3パートHASHインデックスのレンジ条件です。
key_part1= 1 ANDkey_part2IS NULL ANDkey_part3= 'foo'
定数の定義は、項6.2.5.1. 「シングルパートインデックスのためのRangeアクセスメソッド」を参照してください。
BTREEインデックスでは、インターバルはANDと結合された条件に使用できることがあります。これは、各条件がキーパートと定数値を、=,
<=>、IS
NULL、>、<、>=、<=,
!=、<>、BETWEEN、またはLIKE
'を使用して比較した場合です
(pattern''
がワイルドカードで始まらない場合)。条件にマッチする行を全て含むシングルキータプルを判別できるかぎり、インターバルが使用できます。(あるいは、pattern'<>
or
!=が使用されたいれば2インターバル)。例えば、以下の条件では:
key_part1= 'foo' ANDkey_part2>= 10 ANDkey_part3> 10
シングルインターバルは:
('foo',10,10) < (key_part1,key_part2,key_part3) < ('foo',+inf,+inf)
作成されたインターバルが初期条件よりも行が多い可能性があります。例えば、初期条件を満たさない前インターバルが('foo',
11, 0)の値を含んでいます。
インターバルに含まれる行のセットをカバーする条件がORで結合された場合、インターバルの結合に含まれる行のセットをカバーする条件を生成します。ANDで条件が結合された場合、インターバルの交差点に含まれる行のセットをカバーする条件を生成します。例えば、この2パートインデックスの条件について:
(key_part1= 1 ANDkey_part2< 2) OR (key_part1> 5)
インターバルは:
(1,-inf) < (key_part1,key_part2) < (1,2) (5,-inf) < (key_part1,key_part2)
この例では、最初のラインのインターバルはレフトバウンドに1キーパートを使用し、ライトバウンドには2キーパートを使用します。2番目のラインのインターバルは1キーパートのみ使用します。EXPLAIN
出力のkey_lenカラムは、使用されたキープリフィックスの最大長を示しています。
場合によって、key_lenはキーパート使用されたことを示すことがありますが、ユーザが期待していたとおりではないかも知れません。key_part1とkey_part2がNULLだったとします。key_lenカラム次の条件の2キーパート長を表示します。
key_part1>= 1 ANDkey_part2< 2
しかし、実際条件以下に変換されます。
key_part1>= 1 ANDkey_part2IS NOT NULL
項6.2.5.1. 「シングルパートインデックスのためのRangeアクセスメソッド」はシングルパートインデックスでレンジ条件のインターバルを結合か削除の際の最適化がどのように実行されるかを記述しています。マルチパートインデックスのレンジ条件にはアナログステップが実行されます。
