複合パートインデックスのレンジ条件はシングルパートインデックスのレンジ条件の拡張です。複合パートインデックスのレンジ条件はインデックス行が 1 つまたは複数のキータプルインターバルに含まれるよう制限します。キータプルインターバルはキータプルセット上で、インデックスからの順序づけを使用して定義されます。
たとえば、複合パートインデックスが
key1(
として定義され、次のキータプルのセットがキー順序でリストされたとします。
key_part1
、key_part2
、key_part3
)
key_part1
key_part2
key_part3
NULL 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_part1
cmp
const1
ANDkey_part2
cmp
const2
AND ... ANDkey_partN
cmp
constN
;
ここでは、const1
、const2
、…
は定数で、cmp
は
=
、<=>
、または
IS NULL
比較演算子の 1
つであり、条件はすべてのインデックスパートをカバーします。(つまり、N
条件があり、各
N
-パートインデックスごとに
1 つあります)。たとえば、次は 3 パート
HASH
インデックスのレンジ条件です。
key_part1
= 1 ANDkey_part2
IS NULL ANDkey_part3
= 'foo'
定数の定義は、項4.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_part2
IS NOT NULL
項4.2.5.1. 「シングルパートインデックスのための Range アクセスメソッド」はシングルパートインデックスでレンジ条件のインターバルを結合か削除の際の最適化がどのように実行されるかを記述しています。マルチパートインデックスのレンジ条件にはアナログステップが実行されます。