《Mysql實例Mysql中的Btree與Hash索引比較》要點:
本文介紹了Mysql實例Mysql中的Btree與Hash索引比較,希望對您有用。如果有疑問,可以聯系我們。
mysql最常用的索引結構是btree(O(log(n))),但是總有一些情況下我們為了更好的性能希望能使用別的類型的索引.hash就是其中一種選擇,例如我們在通過用戶名檢索用戶id的時候,他們總是一對一的關系,用到的操作符只是=而已,假如使用hash作為索引數據結構的話,時間復雜度可以降到O(1).不幸的是,目前的mysql版本(5.6)中,hash只支持MEMORY和NDB兩種引擎,而我們最常用的INNODB和MYISAM都不支持hash類型的索引.MYSQL入門
不管怎樣,還是要了解一下這兩種索引的區別,下面翻譯自mysql官網文檔中對這兩者的解釋.?MYSQL入門
B-Tree 索引特征MYSQL入門
B-Tree索引可以被用在像=,>,>=,<,<=和BETWEEN這些比較操作符上.而且還可以用于LIKE操作符,只要它的查詢條件是一個不以通配符開頭的常量.像下面的語句就可以使用索引:
MYSQL入門
下面這兩種情況不會使用索引:
MYSQL入門
第一條是因為它以通配符開頭,第二條是因為沒有使用常量.MYSQL入門
假如你使用... LIKE '%string%'而且string超過三個字符,MYSQL使用Turbo Boyer-Moore algorithm算法來初始化查詢表達式,然后用這個表達式來讓查詢更迅速.MYSQL入門
一個這樣的查詢col_name IS NULL是可以使用col_name的索引的.MYSQL入門
任何一個沒有覆蓋所有WHERE中AND級別條件的索引是不會被使用的.也就是說,要使用一個索引,這個索引中的第一列需要在每個AND組中出現.MYSQL入門
下面的WHERE條件會使用索引:
MYSQL入門
下面的WHERE條件不會使用索引:MYSQL入門
??? /* 索引 index 沒有出現在每個 where 子句中 */
... WHERE index=1 OR A=10MYSQL入門
??? /* 沒有索引覆蓋所有列 */
... WHERE index_part1=1 OR index_part2=10
MYSQL入門
有時候mysql不會使用索引,即使這個在可用的情況下.例如當mysql預估使用索引會讀取大部分的行數據時.(在這種情況下,一次全表掃描可能比使用索引更快,因為它需要更少的檢索).然而,假如語句中使用LIMIT來限定返回的行數,mysql則會使用索引.因為當結果行數較少的情況下使用索引的效率會更高.MYSQL入門
Hash 索引特征MYSQL入門
Hash類型的索引有一些區別于以上所述的特征:MYSQL入門
1.它們只能用于對等比較,例如=和<=>操作符(但是快很多).它們不能被用于像<這樣的范圍查詢條件.假如系統只需要使用像“鍵值對”的這樣的存儲結構,盡量使用hash類型索引.
2.優化器不能用hash索引來為ORDER BY操作符加速.(這類索引不能被用于搜索下一個次序的值)
3.mysql不能判斷出兩個值之間有多少條數據(這需要使用范圍查詢操作符來決定使用哪個索引).假如你將一個MyISAM表轉為一個依靠hash索引的MEMORY表,可能會影響一些語句(的性能).
4.只有完整的鍵才能被用于搜索一行數據.(假如用B-tree索引,任何一個鍵的片段都可以用于查找.我覺得可能意味著帶通配符LIKE操作符會不起作用).MYSQL入門
后記MYSQL入門
順便記錄一下在使用mysql過程中碰到的一些問題:MYSQL入門
有時候使用腳本遷移數據時會碰到亂碼的問題,即使將表字符集設置成utf8也無濟于事,這個時候在執行sql之前加一句set names utf8即可.MYSQL入門
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/6208.html