MySQL的索引有哪幾種?

2021-10-04 12:03:50 字數 2527 閱讀 9999

mysql索引的建立對於mysql的高效執行是很重要的,索引可以大大提高mysql的檢索速度。

打個比方,如果合理的設計且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的mysql就是乙個人力三輪車。

索引分單列索引和組合索引。單列索引,即乙個索引只包含單個列,乙個表可以有多個單列索引,但這不是組合索引。組合索引,即乙個索引包含多個列。

建立索引時,你需要確保該索引是應用在 sql 查詢語句的條件(一般作為 where 子句的條件)。

實際上,索引也是一張表,該錶儲存了主鍵與索引字段,並指向實體表的記錄。

上面都在說使用索引的好處,但過多的使用索引將會造成濫用。因此索引也會有它的缺點:雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對表進行insert、update和delete。因為更新表時,mysql不僅要儲存資料,還要儲存一下索引檔案。

建立索引會占用磁碟空間的索引檔案。

以表的單個列欄位建立的索引

以表的多個列欄位組合建立的索引,在查詢條件使用索引的從左欄位順序才會生效,遵循最左匹配原則。

普通索引

非主鍵,非唯一列的索引

主鍵索引

基於該錶主鍵自動生成成的索引,如果未給表定義主鍵,會查詢該表中是否存在非空、整形、唯一索引作為其主鍵(可通過select _rowid from 表名檢視),若都不滿足會隱式生成乙個rowid作為主鍵(無法直接查到)

唯一索引

基於表的唯一列生成的索引,允許為空值

全文索引

將儲存於資料庫中的整本書或整篇文章中任意內容資訊查詢出來,如大量級的文字中如like %關鍵字%,普通索引的效率與全文索引相比是非常低的。

b+tree基於平衡二叉樹的一種多路平衡查詢樹,所有記錄都按照順序存放在葉子節點中,各個葉子節點直接通過鍊錶相連。與b樹不同的是:

非葉子節點只儲存鍵值資訊。

所有葉子節點之間都有乙個鏈指標。

資料記錄都存放在葉子節點中。

基於hash表結構實現的索引,mysql中只有memory/heap和ndb儲存引擎支援;

innodb引擎支援自適應hash索引,但是是資料庫自身建立使用的,而不能進行人為定義。當二級索引被頻繁的訪問時,便會自動建立自適應雜湊索引;

通過 命令show engine innodb status可檢視自適應hash索引的使用情況;

通過 命令show variables like '%ap%hash_index' 檢視是否開啟自適應hash索引。

對比:

由於hash索引是比較其hash值,hash索引只能進行等值查詢而不能進行範圍查詢

hash索引無法進行排序:原因同上

不支援最左匹配原則,復合索引時合併一起計算hash值

hash索引的檢索效率很高可以一次定位,但是當發生大量hash碰撞的時候,鍊錶變長,hash索引效率上是不如b+tree的

由於存在hash碰撞的問題,當需要獲得總數時候,hash 索引在任何時候都不能避免表掃瞄

innodb的聚簇索引實際上是在同乙個btree結構中同時儲存了索引和整行資料,通過該索引查詢可以直接獲取查詢資料行。

聚簇索引不是一種單獨的索引型別,而是一種資料的儲存方式,聚簇索引的順序,就是資料在硬碟上的物理順序。

在mysql通常聚簇索引是主鍵的同義詞,每張表只包含乙個聚簇索引(其他資料庫不一定)。

非聚集索引在btree的葉子節點中儲存了索引列和主鍵。如果查詢列不在該索引內,只能查到其主鍵值,還需要回表操作查詢聚簇索引進行查詢。

聚簇索引的優點:

可以把相關資料儲存在一起,如:實現電子郵箱時,可以根據使用者id來聚集資料,這樣只需要從磁碟讀取少量的資料頁就能獲取某個使用者全部郵件,如果沒有使用聚集索引,則每封郵件都可能導致一次磁碟io。

資料訪問更快,聚集索引將索引和資料儲存在同乙個btree中,因此從聚集索引中獲取資料通常比在非聚集索引中查詢要快。

使用覆蓋索引掃瞄的查詢可以直接使用頁節點中的主鍵值。

聚簇索引的缺點:

聚簇資料最大限度地提高了io密集型應用的效能,但如果資料全部放在記憶體中,則訪問的順序就沒有那麼重要了,聚集索引也沒有什麼優勢了

插入速度嚴重依賴於插入順序,按照主鍵的順序插入是載入資料到innodb表中速度最快的方式,但如果不是按照主鍵順序載入資料,那麼在載入完成後最好使用optimize table命令重新組織一下表。

更新聚集索引列的代價很高,因為會強制innodb將每個被更新的行移動到新的位置。

基於聚集索引的表在插入新行,或者主鍵被更新導致需要移動行的時候,可能面臨頁**的問題,當行的主鍵值要求必須將這一行插入到某個已滿的頁中時,儲存引擎會將該頁**成兩個頁面來容納該行,這就是一次頁**操作,頁**會導致表占用更多的磁碟空間。

聚集索引可能導致全表掃瞄變慢,尤其是行比較稀疏,或者由於頁**導致資料儲存不連續的時候。

二級索引可能比想象的更大,因為在二級索引的葉子節點包含了引用行的主鍵列。

二級索引訪問需要兩次索引查詢,而不是一次。

什麼是索引 索引有哪幾種

索引用來快速地尋找那些具有特定值的記錄,所有mysql索引都以b 樹的形式儲存。如果沒有索引,執行查詢時mysql必須從第 乙個記錄開始掃瞄整個表的所有記錄,直至找到符合要求的記錄。表裡面的記錄數量越多,這個操作的代價就越高。如果作為 搜尋條件的列上已經建立了索引,mysql無需掃瞄任何記錄即可迅速...

mysql主鍵 mysql的主鍵有哪幾種

1 自增序列 2 uuid 函式生成的隨機值 3 使用者註冊的唯一性帳號名稱,字串型別,一般長度為 40個字元 4 基於一套機制生成類似自增的值,比如序列生成器 那麼我們接下來,再分析下這四類屬性各自作為表主鍵的優缺點 1 自增序列 從小到大 或從大到小的順序模式增加新值 資料型別也利於進行主鍵值比...

vi有哪幾種模式

vi有三種工作模式,分別是 1 命令模式,是啟動vi後進入的工作模式,並可轉換為文字編輯模式和最後行模式 2 文字編輯模式,用於字元編輯 3 最後行模式。vi有三種工作模式 命令模式 文字編輯模式和最後行模式。不同工作模式下的操作方法有所不同。1 命令模式 命令模式是啟動vi後進入的工作模式,並可轉...