乙個是樹, 乙個是雜湊表.
所以:1. 樹的可以用前置模糊, 雜湊表不行,
2. 精確查詢雜湊表可以直接從k定位v, 但是樹要走索引節點,
3, 雜湊表不能排序, 樹可以,
4. 雜湊表查詢一定會全表掃瞄.
mysql最常用的索引結構是btree(o(log(n))),但是總有一些情況下我們為了更好的效能希望能使用別的型別的索引。hash就是其中一種選擇,例如我們在通過使用者名稱檢索使用者id的時候,他們總是一對一的關係,用到的操作符只是=而已,假如使用hash作為索引資料結構的話,時間複雜度可以降到o(1)。不幸的是,目前的mysql版本(5.6)中,hash只支援memory和ndb兩種引擎,而我們最常用的innodb和myisam都不支援hash型別的索引。
不管怎樣,還是要了解一下這兩種索引的區別,下面翻譯自mysql官網文件中對這兩者的解釋。
b-tree 索引特徵
b-tree索引可以被用在像=,>,>=,<,<=和between這些比較操作符上。而且還可以用於like操作符,只要它的查詢條件是乙個不以萬用字元開頭的常量。像下面的語句就可以使用索引:
複製**
**如下:
select * from tbl_name where key_col like 'patrick%';
select * from tbl_name where key_col like 'pat%_ck%';
下面這兩種情況不會使用索引:
複製**
**如下:
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級別條件的索引是不會被使用的。也就是說,要使用乙個索引,這個索引中的第一列需要在每個and組中出現。
下面的where條件會使用索引:
複製**
**如下:
... 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.它們只能用於對等比較,例如=和<=>操作符(但是快很多)。它們不能被用於像《這樣的範圍查詢條件。假如系統只需要使用像「鍵值對」的這樣的儲存結構,盡量使用hash型別索引。
2.優化器不能用hash索引來為order by操作符加速。(這類索引不能被用於搜尋下乙個次序的值)
3.mysql不能判斷出兩個值之間有多少條資料(這需要使用範圍查詢操作符來決定使用哪個索引)。假如你將乙個myisam表轉為乙個依靠hash索引的memory表,可能會影響一些語句(的效能)。
4.只有完整的鍵才能被用於搜尋一行資料。(假如用b-tree索引,任何乙個鍵的片段都可以用於查詢。我覺得可能意味著帶萬用字元like操作符會不起作用)。
後記
順便記錄一下在使用mysql過程中碰到的一些問題:
有時候使用指令碼遷移資料時會碰到亂碼的問題,即使將表字符集設定成utf8也無濟於事,這個時候在執行sql之前加一句set names utf8即可。
Mysql中BTREE索引與HASH索引的區別
ash 索引結構的特殊性,其檢索效率非常高,索引的檢索可以一次定位,不像b tree 索引需要從根節點到枝節點,最後才能訪問到頁節點這樣多次的io訪問,所以 hash 索引的查詢效率要遠高於 b tree 索引。可 能很多人又有疑問了,既然 hash 索引的效率要比 b tree 高很多,為什麼大家...
Btree 與 Btree 的區別
mysql 的優化,主要就是索引的優化。因而需要對索引的資料結構有乙個了解。最常用的索引就是b tree 索引,而且b tree 是由btree 演變而來。在講解btree 之前,首先說一下系統對磁碟的讀取。計算機系統通過將磁碟的內容讀入記憶體中然後才對資料進行操作。當然不可能將全部磁碟的內容讀入記...
B Tree與B Tree 的區別
1 b 樹的關鍵字和記錄是放在一起的,葉子節點可以看作外部節點,不包含任何資訊 b 樹的非葉子節點中只有關鍵字和指向下乙個節點的索引,記錄只放在葉子節點中。2 在b 樹中,越靠近根節點的記錄查詢時間越快,只要找到關鍵字即可確定記錄的存在 而b 樹中每個記錄的查詢時間基本是一樣的,都需要從根節點走到葉...