1. 程式人生 > >聊一聊 InnoDB 引擎中的索引型別

聊一聊 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 相關文章,如有雷同,請多多包涵了。原創不易,碼字不易,還希望大家多多支援。若文中有所錯誤之處,還望提出,謝謝。

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