聊一聊 InnoDB 引擎中的索引類型


索引對數據庫有多重要,我想大家都已經知道了吧,關於索引可能大家會對它多少有一些誤解,首先索引是一種數據結構,並且索引不是越多越好。合理的索引可以提高存儲引擎對數據的查詢效率。

形象一點來說呢,索引跟書本的目錄一樣,能否快速的查找到你需要的信息,取決於你設計的目錄是否合理。

MySQL 數據庫有很多種索引,每種存儲引擎的索引都不太一樣,這篇文章就介紹一下 InnoDB 引擎種的索引,在 InnoDB 引擎中有三種索引:

  • B-Tree 索引
  • 哈希索引
  • 全文索引

B-Tree 索引

B-Tree 索引是 InnoDB 引擎的默認索引,如果我們沒有特別指定索引,那么說的就是 B-Tree 索引。在 InnoDB 引擎中使用 B+樹來實現 B-Tree 索引,關於 B+樹的知識就百度吧,我也講不清楚。

在 B-Tree 索引中又有主鍵索引和普通索引之分,分別來了解一下:

1、主鍵索引

主鍵索引也叫聚集索引,是按照主鍵構建得一棵 B+樹,只要建立了主鍵就會自動加上索引,主鍵索引得特點是:葉子節點上存放着整張表得行記錄數據,所以葉子節點也叫數據頁

正是因為這個特點,對於主鍵的排序查找和范圍查找速度非常快,因為索引上就有用戶需要查詢的數據,所以不會要回表查詢,這樣就加快了查詢速度,關於什么是回表,普通索引的時候再聊一聊。

2、普通索引

普通索引也叫二級索引,跟主鍵索引的主要區別在於葉子結點沒有存放行記錄的全部數據,只包含了需要的鍵值,還有一個標簽,用來告訴存儲引擎在哪里可以找到這行數據。

舉個例子,讓我們剛好的理解普通索引,如下面這張表:

mysql> create table T(
id int primary key, 
k int not null, 
name varchar(16),
index (k)) engine=InnoDB;

K 索引就是普通索引,除了主鍵之外的索引都是普通索引。

普通索引因為行記錄里沒有數據的全部信息,在使用普通索引查詢時,需要現在普通索引樹上搜索一遍,再回到主鍵索引樹上查詢到需要的信息,這個過程也叫回表

可能回表不太好理解,我引用極客時間《MySQL實戰45講》里面的例子,先看下面這張圖:

左邊的是主鍵索引樹,右邊的是 K 索引樹,假設我們現在要執行select * from T where k=5 語句,即普通索引查詢方式,則需要先搜索 k 索引樹,得到 K=5 對應的 ID 值為 500,再到 ID 索引樹搜索一次,這個過程稱為回表。

哈希索引

哈希索引在 InnoDB 引擎中叫作自適應哈希索引,它是由數據庫自身根據你的使用情況創建的,並不能認為的干預,所以叫作自適應哈希索引,采用的是哈希表數據結構,所以對於字典類型查詢就非常的快,但是對於范圍查詢就無能為力啦。

全文索引

在 B-Tree索引中,當我們執行 select * from blog where content like %xxxx% 語句時,索引會失效。全文索引可以有效的解決這種語句查詢。

全文索引是一種比較特殊的索引,一般都是基於倒排索引來實現的,es 也是使用倒排索引。倒排索引跟 B-Tree 索引一樣也是一種數據結構,在輔助表中存儲了單詞與單詞自身在一個或多個文檔中所在位置的映射。

現在有很多專門做全文索引的軟件,例如 solr、elasticsearch等,MySQL 中的全文索引實現原理跟這些差不多。

以上就是關於 InnoDB 引擎中的索引類型,感謝您的閱讀,希望這篇文章對您的學習或者工作有所幫助。

最后

目前互聯網上很多大佬都有 MySQL 相關文章,如有雷同,請多多包涵了。原創不易,碼字不易,還希望大家多多支持。若文中有所錯誤之處,還望提出,謝謝。

歡迎掃碼關注微信公眾號:「平頭哥的技術博文」,和平頭哥一起學習,一起進步。

平頭哥的技術博文


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM