top
Loading...
7.2.5.2.多元素索引的范圍訪問方法
7.2.5.2. 多元素索引的范圍訪問方法

多元素索引的范圍條件是單元素索引的范圍條件的擴展。多元素索引的范圍條件將索引記錄限制到一個或幾個關鍵元組內。使用索引的順序,通過一系列關鍵元組來定義關鍵元組區間。

例如,考慮定義為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_part1key_part2key_part3) < (1+inf+inf)

范圍包括前面數據集中的第456個元組,可以用于范圍訪問方法。

通過對比,條件key_part3 = 'abc'不定義單一的區間,不能用于范圍訪問方法。

下面更加詳細地描述了范圍條件如何用于多元素索引中。

·         對于HASH索引,可以使用包含相同值的每個區間。這說明區間只能由下面形式的條件產生:

·                     key_part1 cmp const1
·                 AND key_part2 cmp const2
·                 AND ...
·                AND key_partN cmp constN;

這里,const1const2...為常量,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'1010)
   < (key_part1key_part2key_part3)
      < ('foo'+inf+inf)

創建的區間可以比原條件包含更多的記錄。例如,前面的區間包括值('foo'110),不滿足原條件。

·         如果包含區間內的一系列記錄的條件結合使用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_part1key_part2可以為NULL。則key_len列顯示下面條件的兩個關鍵元素的長度:

key_part1 >= 1 AND key_part2 < 2

但實際上,該條件可以變換為:

key_part1 >= 1 AND key_part2 IS NOT NULL

7.2.5.1節,“單元素索引的范圍訪問方法”描述了如何進行優化以結合或刪除單元素索引范圍條件的區間。多元素索引范圍條件的區間的步驟類似。

作者:mysql.com
來源:http://dev.mysql.com/doc/refman/5.1/zh/optimization.html
北斗有巢氏 有巢氏北斗