B-Tree索引與Hash索引的比較

B-Tree索引與Hash索引的比較

翻譯自http://dev.mysql.com/doc/refman/5.6/en/index-btree-hash.htmlhtml

理解B-Tree和Hash的數據結構可以幫助咱們預測不一樣存儲引擎下的查詢性能差別。存儲引擎在索引中使用這些數據結構,尤爲是MEMORY 同時提供了B-Tree和Hash索引讓你選擇。mysql

B-Tree索引特性


B-Tree索引能夠在表達式中使用=, >, >=, <, <=用做列比較或者 BETWEEN 運算符。還能使用LIKE比較,若是參數是一個不以通配符開頭的常量。舉個例子,下面的SELECT語句使用了索引:算法

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

第一條語句中,只有'Patrick' <= keycol < 'Patricl' 的行會被考慮。第二條語句中,只有'Pat' <= keycol < 'Pau' 的行會被考慮。sql

下面的SELECT語句沒有使用索引:數據結構

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算法來初始化查詢表達式,而後用這個表達式來讓查詢更迅速。優化

查詢中有colname IS NULL可使用colname索引。spa

任何一個沒有覆蓋全部WHERE中AND級別條件的索引是不會被使用的。也就是說,要使用一個索引,這個索引中的第一列須要在每一個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

    /* optimized like "index_part1='hello'" */
... WHERE index_part1='hello' AND index_part3=5

    /* Can use index on index1 but not on index2 or index3 */
... WHERE index1=1 AND index2=2 OR index1=3 AND index3=3;

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

/* index_part1 is not used */
... WHERE index_part2=1 AND index_part3=2

    /*  Index is not used in both parts of the WHERE clause  */
... WHERE index=1 OR A=10

    /* No index spans all rows  */
... WHERE index_part1=1 OR index_part2=10

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

Hash索引特性


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

  • 它們只能用於對等比較,例如=和<=>操做符(可是快不少)。它們不能被用於像<這樣的範圍查詢條件。假如系統只須要使用像「鍵值對」的這樣的存儲結構,儘可能使用hash類型索引。

  • 優化器不能用hash索引來爲ORDER BY操做符加速。(這類索引不能被用於搜索下一個次序的值)

  • MySQL不能判斷出兩個值之間有多少條數據(這須要使用範圍查詢操做符來決定使用哪一個索引)。假如你將一個MyISAM表或InnoDB錶轉爲一個依靠hash索引的MEMORY表,這可能會影響一些查詢。

  • 只有完整的鍵才能被用於搜索一行數據(使用了B-Tree索引,那麼任何一個鍵的前綴均可以用於查找)。

相關文章
相關標籤/搜索