Mysql中的Btree與Hash索引

B-Tree 索引特徵

B-Tree索引能夠被用在像=,>,>=,<,<=和BETWEEN這些比較操做符上。並且還能夠用於LIKE操做符,只要它的查詢條件是一個不以通配符開頭的常量。像下面的語句就可使用索引:mysql

SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%';
SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%';算法

下面這兩種狀況不會使用索引:sql

SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%';
SELECT * FROM tbl_name WHERE key_col LIKE other_col;

第一條是由於它以通配符開頭,第二條是由於沒有使用常量。函數

假如你使用... LIKE '%string%'並且string超過三個字符,MYSQL使用Turbo Boyer-Moore algorithm算法來初始化查詢表達式,而後用這個表達式來讓查詢更迅速。性能

一個這樣的查詢col_name IS NULL是可使用col_name的索引的。優化

任何一個沒有覆蓋全部WHERE中AND級別條件的索引是不會被使用的。spa

也就是說,要使用一個索引,這個索引中的第一列須要在每一個AND組中出現指針

下面的WHERE條件會使用索引:code

... WHERE index_part1=1 AND index_part2=2 AND other_column=3
    /* index = 1 OR index = 2 */
... WHERE index=1 OR A=10 AND index=2
    /* 優化成 "index_part1='hello'" */
... WHERE index_part1='hello' AND index_part3=5
    /* 可使用 index1 的索引可是不會使用 index2 和 index3 */
... WHERE index1=1 AND index2=2 OR index1=3 AND index3=3;

下面的WHERE條件不會使用索引:排序

    /* index_part1 沒有被使用到 */
... WHERE index_part2=1 AND index_part3=2
   /* 索引 index 沒有出如今每一個 where 子句中 */
... WHERE index=1 OR A=10
   /* 沒有索引覆蓋全部列 */
... WHERE index_part1=1 OR index_part2=10

有時候mysql不會使用索引,即便這個在可用的狀況下。例如當mysql預估使用索引會讀取大部分的行數據時。(在這種狀況下,一次全表掃描可能比使用索引更快,由於它須要更少的檢索)。然而,假如語句中使用LIMIT來限定返回的行數,mysql則會使用索引。由於當結果行數較少的狀況下使用索引的效率會更高。

Hash 索引特徵

Hash類型的索引有一些區別於以上所述的特徵:

1.它們只能用於對等比較,例如=、in、<=>操做符(可是快不少)。它們不能被用於像<這樣的範圍查詢條件。假如系統只須要使用像「鍵值對」的這樣的存儲結構,儘可能使用hash類型索引。
2.優化器不能用hash索引來爲ORDER BY操做符加速。(這類索引不能被用於搜索下一個次序的值)
3.mysql不能判斷出兩個值之間有多少條數據(這須要使用範圍查詢操做符來決定使用哪一個索引)。假如你將一個MyISAM錶轉爲一個依靠hash索引的MEMORY表,可能會影響一些語句(的性能)。
4.只有完整的鍵才能被用於搜索一行數據。(假如用B-tree索引,任何一個鍵的片斷均可以用於查找。我以爲可能意味着帶通配符LIKE操做符會不起做用)。

5. Hash索引任什麼時候候都不能避免表掃描 
Hash索引是將索引鍵經過Hash運算以後,將Hash運算結果的Hash值和所對應的行指針信息存放於一個Hash表中,因爲不一樣索引鍵存在相同Hash值,因此即便知足某個Hash鍵值的數據的記錄條數,也沒法從Hash索引中直接完成查詢,仍是要經過訪問表中的實際數據進行比較,並獲得相應的結果。 

補充總結:
HASH索引:利用哈希函數,計算存儲地址,檢索時不須要像Btree那樣,從根節點開始遍歷,逐級查找。    
 優勢: 查找效率高。
 侷限:     
      僅僅知足=,in,<=>,查詢, 不能範圍查詢(原先有序的鍵值通過哈希函數運算,可能再也不連續);
      沒法用於排序操做(order by);
      當重複值時,效率並不比BTree高;
      不能利用部分索引鍵查詢;
相關文章
相關標籤/搜索