索引類型有:1、B-樹索引,使表中的每一行都會在索引上有一個對應(yīng)值;2、哈希索引,可根據(jù)索引列對應(yīng)的哈希值的方法獲取表的記錄行;3、普通索引,允許在定義索引的列中插入重復(fù)值和空值;4、唯一索引,可以避免數(shù)據(jù)出現(xiàn)重復(fù);5、主鍵索引,是為主鍵字段創(chuàng)建的索引;6、空間索引,是對空間數(shù)據(jù)類型的字段建立的索引;7、全文索引,用來查找文本中的關(guān)鍵字;8、單列索引,即索引只包含原表的一個列。
本教程操作環(huán)境:windows7系統(tǒng)、mysql8版本、Dell G3電腦。
MySQL索引類型詳解
索引的類型和存儲引擎有關(guān),每種存儲引擎所支持的索引類型不一定完全相同。MySQL 索引可以從存儲方式、邏輯角度和實(shí)際使用的角度來進(jìn)行分類。
存儲方式區(qū)分
根據(jù)存儲方式的不同,MySQL 中常用的索引在物理上分為 B-樹索引和 HASH 索引兩類,兩種不同類型的索引各有其不同的適用范圍。
1) B-樹索引
B-樹索引又稱為 BTREE 索引,目前大部分的索引都是采用 B-樹索引來存儲的。
B-樹索引是一個典型的數(shù)據(jù)結(jié)構(gòu),其包含的組件主要有以下幾個:
- 葉子節(jié)點(diǎn):包含的條目直接指向表里的數(shù)據(jù)行。葉子節(jié)點(diǎn)之間彼此相連,一個葉子節(jié)點(diǎn)有一個指向下一個葉子節(jié)點(diǎn)的指針。
- 分支節(jié)點(diǎn):包含的條目指向索引里其他的分支節(jié)點(diǎn)或者葉子節(jié)點(diǎn)。
- 根節(jié)點(diǎn):一個 B-樹索引只有一個根節(jié)點(diǎn),實(shí)際上就是位于樹的最頂端的分支節(jié)點(diǎn)。
基于這種樹形數(shù)據(jù)結(jié)構(gòu),表中的每一行都會在索引上有一個對應(yīng)值。因此,在表中進(jìn)行數(shù)據(jù)查詢時,可以根據(jù)索引值一步一步定位到數(shù)據(jù)所在的行。
B-樹索引可以進(jìn)行全鍵值、鍵值范圍和鍵值前綴查詢,也可以對查詢結(jié)果進(jìn)行 ORDER BY 排序。但 B-樹索引必須遵循左邊前綴原則,要考慮以下幾點(diǎn)約束:
- 查詢必須從索引的最左邊的列開始。
- 查詢不能跳過某一索引列,必須按照從左到右的順序進(jìn)行匹配。
- 存儲引擎不能使用索引中范圍條件右邊的列。
2) 哈希索引
哈希(Hash)一般翻譯為“散列”,也有直接音譯成“哈希”的,就是把任意長度的輸入(又叫作預(yù)映射,pre-image)通過散列算法變換成固定長度的輸出,該輸出就是散列值。
哈希索引也稱為散列索引或 HASH 索引。MySQL 目前僅有 MEMORY 存儲引擎和 HEAP 存儲引擎支持這類索引。其中,MEMORY 存儲引擎可以支持 B-樹索引和 HASH 索引,且將 HASH 當(dāng)成默認(rèn)索引。
HASH 索引不是基于樹形的數(shù)據(jù)結(jié)構(gòu)查找數(shù)據(jù),而是根據(jù)索引列對應(yīng)的哈希值的方法獲取表的記錄行。哈希索引的最大特點(diǎn)是訪問速度快,但也存在下面的一些缺點(diǎn):
- MySQL 需要讀取表中索引列的值來參與散列計算,散列計算是一個比較耗時的操作。也就是說,相對于 B-樹索引來說,建立哈希索引會耗費(fèi)