關於mysql索引類型,網上有很多相關的介紹,給人的感覺很亂。鄙人在翻閱相關書籍後,特意梳理了一下。哪裏有不對的地方,歡迎指正!
1. B-Tree索引
它使用B-Tree數據結構來存儲數據,實際上很多存儲引擎使用的是B+Tree。B+Tree和B-Tree的不同點在於:
(1) 非葉子節點只存儲鍵值信息
(2) 所有葉子節點之間都有鏈指針
(3) 數據記錄都存放在葉子節點中
B-Tree模型:
B+Tree模型:
B-Tree對索引列是順序組織存儲的,很適合查找範圍數據。看下B-Tree索引適用哪些查詢:
(1) 全值匹配
全值匹配是指查詢中使用的條件和索引中的所有列進行匹配。比如有索引 index(last_name, first_name, date) ,查詢的條件爲:where last_name=? and first_name=? and date=? 。
(2) 匹配最左前綴
只使用索引的第一列。比如查詢條件爲:where last_name = ?
(3) 匹配列前綴
只匹配某一列值得開頭部分。
(4) 匹配範圍值
(5) 精確匹配某一列並範圍匹配另一列
比如:where last_name = ? and first_name like kim%
(6) 只訪問索引的查詢
2. 哈希索引
哈希索引基於哈希表實現。哈希索引將所有的哈希碼存儲在索引中,同時在哈希表中保存指向每個數據行的指針。在mysql中,Memory引擎顯式支持哈希索引。
舉例說明,有張表:
CREATE TABLE testhash (
fname VARCHAR(50) NOT NULL,
lname VARCHAR(50) NOT NULL,
KEY USING HASH(fname)
) ENGINE=MEMORY;
表中有如下數據:
fname | lname |
Arjen | Lentz |
Baron | Schwartz |
Peter | Zaitsev |
Vadim | Tkachenko |
假設索引使用假想的哈希函數f(), 如下:
f('Arjen') = 2323
f('Baron') = 7437
f('Peter') = 8784
f('Vadim') = 2458
那麼哈希索引的數據結構:
槽(Slot) 值(Value)
2323 指向第1行的指針
2458 指向第4行的指針
7437 指向第2行的指針
8784 指向第3行的指針
如果使用一條sql語句進行查詢:select lname from testhash where fname = 'Peter'; 過程爲:
計算‘Peter’的哈希值(f('Peter')=8784)----->查找哈希值對應的指針----->根據指針或得相應的數據。
哈希索引的特點:索引的結構十分緊湊,因此查找速度非常快;哈希索引數據不是按照索引順序存儲的,無法用於排序;哈希索引不支持部分索引列匹配查找;哈希索引只支持等值比較查詢(=,IN(),<=>),不支持範圍查詢,如where price>100;
3. 全文索引
全文索引查找的是文本中的關鍵詞,不是直接比較索引中的值。
- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------