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