mysql索引類型(按存儲結構劃分)

關於mysql索引類型,網上有很多相關的介紹,給人的感覺很亂。鄙人在翻閱相關書籍後,特意梳理了一下。哪裏有不對的地方,歡迎指正!

1. B-Tree索引

    它使用B-Tree數據結構來存儲數據,實際上很多存儲引擎使用的是B+Tree。B+Tree和B-Tree的不同點在於:

    (1) 非葉子節點只存儲鍵值信息

    (2) 所有葉子節點之間都有鏈指針

    (3) 數據記錄都存放在葉子節點中

    B-Tree模型:

   

    B+Tree模型:

     

image.png

   

 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; 

    表中有如下數據:

fnamelname
ArjenLentz
BaronSchwartz
PeterZaitsev
VadimTkachenko

假設索引使用假想的哈希函數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. 全文索引

    全文索引查找的是文本中的關鍵詞,不是直接比較索引中的值。

- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章