InnoDB存儲引擎的索引

概述

InnoDB存儲引擎目前支持以下索引

  • B+樹索引:關係型數據庫總最常用和最爲有效的索引
  • 哈希索引:優化器根據表的使用情況自動構建哈希索引(如果優化器覺得使用哈希索引效率更高),不能認爲手動構建
  • 全文索引:使用倒排索引構建,實現將整篇文章中的任意內容快速查找出來。

B+樹索引

關於B+樹的實現,可見漫畫算法:什麼是B+樹
數據庫中的B+樹索引分爲聚集索引和輔助索引,區別是葉子節點是否存放行記錄的完整數據。另外還有兩種使用方式:聯合索引和覆蓋索引。

聚集索引

聚集索引就是按照主鍵來構造一顆B+樹,同時葉子節點存放的是整張表的行記錄信息。(如果表中沒有主鍵的話,就選擇表中第一個不允許爲NULL的字段作爲聚集索引。如果還是沒有的話就採用Innodb存儲引擎爲每行數據內置的6字節ROWID作爲聚集索引)。由於實際的數據頁只能按一顆B+樹來排序,所以一張表只能有一個聚集索引。
由於聚集索引的存儲是連續的,所以對於主鍵的排序查找和範圍查找特別快,因爲葉子節點存放了整行的數據,所以葉子節點的數據就是要找的數據。

輔助索引

輔助索引與聚集索引的區別就是,輔助索引的葉子節點沒有存放整行數據。它只存放了一個鍵值(輔助索引鍵值)和一個指向聚集索引對應行的書籤(其實就是一個對應行的聚集索引鍵值))。由於輔助索引對聚集索引並沒有影響,所以一張表可以有多個輔助索引。並且由於輔助索引沒有存放整行的數據,所以輔助索引佔用的空間比聚集索引要小很多,相對IO操作更少。通過輔助索引來查找數據時,會先通過鍵值找到葉子節點,然後通過書籤去聚集索引查找對應的數據,由此導致了輔助索引將比聚集索引使用更多的IO操作,所以性能較聚集索引低。

輔助索引與聚集索引的關係如下圖:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-cyiCPz9n-1575039263279)(https://i.loli.net/2019/11/29/UndhHY2sjLD1Q4f.png)]

聯合索引

聯合索引是指對錶中的多個列創建一個索引。因爲聯合索引將多個列按順序存放在了同一個索引中,所以使用聯合索引的好處就是對於多條件查詢,通過葉子節點就能查找到所有數據。對於聯合索引(a, b),對單個的列a進行查詢可以使用聯合索引,而對列b不能使用。因爲聯合索引是按照a進行排序的,對於b來說並沒有排序。如果同時存在聯合索引(a, b)和單個索引a,那麼當然優先使用單個索引a,因爲單個索引存放的數據更多。

覆蓋索引

InnoDB支持覆蓋索引。即如果從輔助索引就能直接得到查詢結果的,就不需要再去訪問聚集索引啦,這樣能減少很多不必要的IO操作。因爲輔助索引存放了本身的鍵值以及主鍵,所以如果查詢操作只涉及到輔助索引和主鍵,就可以直接使用覆蓋索引,而不用去訪問聚集索引了。例如當前輔助索引是number,有如下SQL語句,將會使用覆蓋索引,因爲它只涉及到對輔助索引的查詢。

select count(*) from student where number > 20 and number < 30;

哈希索引

哈希算法是一種時間複雜度爲O(1)的查找算法,InnoDB中也支持了哈希算法對字典進行查找,衝突機制採用最常用的鏈表方式,哈希函數採用除法散列方式。但是在InnoDB中的哈希算法是自適應的,所以不能人爲創建。

全文索引

全文檢索通常使用倒排索引來實現,倒排索引同B+樹索引一樣,也是一種索引結構。它在輔助表中存儲了單詞與單詞自身在一個或多個文檔中所在位置之間的映射。

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