複合パートインデックスのレンジ条件はシングルパートインデックスのレンジ条件の拡張です。複合パートインデックスのレンジ条件はインデックス行が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'
定数の定義は、項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_part2
IS NOT NULL
項6.2.5.1. 「シングルパートインデックスのためのRangeアクセスメソッド」はシングルパートインデックスでレンジ条件のインターバルを結合か削除の際の最適化がどのように実行されるかを記述しています。マルチパートインデックスのレンジ条件にはアナログステップが実行されます。