多元素索引的范圍條件是單元素索引的范圍條件的擴展。多元素索引的范圍條件將索引記錄限制到一個或幾個關鍵元組內。使用索引的順序,通過一系列關鍵元組來定義關鍵元組區間。
例如,考慮定義為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
· AND key_part2 cmp const2
· AND ...
· AND key_partN cmp constN;
這里,const1,const2,...為常量,cmp是=、<=>或者IS NULL比較操作符之一,條件包括所有索引部分。(也就是說,有N 個條件,每一個對應N-元素索引的每個部分)。
關于常量的定義,參見7.2.5.1節,“單元素索引的范圍訪問方法”。
例如,下面為三元素HASH索引的范圍條件:
key_part1 = 1 AND key_part2 IS NULL AND key_part3 = 'foo'
· 對于BTREE索引,區間可以對結合AND的條件有用,其中每個條件用一個常量值通過=、<=>、IS NULL、>、<、>=、<=、!=、<>、BETWEEN或者LIKE 'pattern' (其中'pattern'不以通配符開頭)比較一個關鍵元素。區間可以足夠長以確定一個包含所有匹配條件(或如果使用<>或!=,為兩個區間)的記錄的單一的關鍵元組。例如,對于條件:
· key_part1 = 'foo' AND key_part2 >= 10 AND key_part3 > 10
單一區間為:
('foo',10,10)
< (key_part1,key_part2,key_part3)
< ('foo',+inf,+inf)
創建的區間可以比原條件包含更多的記錄。例如,前面的區間包括值('foo',11,0),不滿足原條件。
· 如果包含區間內的一系列記錄的條件結合使用OR,則形成包括一系列包含在區間并集的記錄的一個條件。如果條件結合使用了AND,則形成包括一系列包含在區間交集內的記錄的一個條件。例如,對于兩部分索引的條件:
· (key_part1 = 1 AND key_part2 < 2)
· OR (key_part1 > 5)
區間為:
(1, -inf) < (key_part1, key_part2) < (1, 2)
(5, -inf) < (key_part1, key_part2)
在該例子中,第1行的區間左側的約束使用了一個關鍵元素,右側約束使用了兩個關鍵元素。第2行的區間只使用了一個關鍵元素。EXPLAIN輸出的key_len列表示所使用關鍵字前綴的最大長度。
在某些情況中,key_len可以表示使用的關鍵元素,但可能不是你所期望的。假定key_part1和key_part2可以為NULL。則key_len列顯示下面條件的兩個關鍵元素的長度:
key_part1 >= 1 AND key_part2 < 2
但實際上,該條件可以變換為:
key_part1 >= 1 AND key_part2 IS NOT NULL
7.2.5.1節,“單元素索引的范圍訪問方法”描述了如何進行優化以結合或刪除單元素索引范圍條件的區間。多元素索引范圍條件的區間的步驟類似。