索引對數據庫有多重要,我想你們都已經知道了吧,關於索引可能你們會對它多少有一些誤解,首先索引是一種數據結構,而且索引不是越多越好。合理的索引能夠提升存儲引擎對數據的查詢效率。java
形象一點來講呢,索引跟書本的目錄同樣,可否快速的查找到你須要的信息,取決於你設計的目錄是否合理。mysql
MySQL 數據庫有不少種索引,每種存儲引擎的索引都不太同樣,這篇文章就介紹一下 InnoDB 引擎種的索引,在 InnoDB 引擎中有三種索引:sql
B-Tree 索引是 InnoDB 引擎的默認索引,若是咱們沒有特別指定索引,那麼說的就是 B-Tree 索引。在 InnoDB 引擎中使用 B+樹來實現 B-Tree 索引,關於 B+樹的知識就百度吧,我也講不清楚。數據庫
在 B-Tree 索引中又有主鍵索引和普通索引之分,分別來了解一下:微信
主鍵索引也叫彙集索引,是按照主鍵構建得一棵 B+樹,只要創建了主鍵就會自動加上索引,主鍵索引得特色是:葉子節點上存放着整張表得行記錄數據,因此葉子節點也叫數據頁。數據結構
正是由於這個特色,對於主鍵的排序查找和範圍查找速度很是快,由於索引上就有用戶須要查詢的數據,因此不會要回表查詢,這樣就加快了查詢速度,關於什麼是回表,普通索引的時候再聊一聊。elasticsearch
普通索引也叫二級索引,跟主鍵索引的主要區別在於葉子結點沒有存放行記錄的所有數據,只包含了須要的鍵值,還有一個標籤,用來告訴存儲引擎在哪裏能夠找到這行數據。學習
舉個例子,讓咱們恰好的理解普通索引,以下面這張表:設計
mysql> create table T( id int primary key, k int not null, name varchar(16), index (k)) engine=InnoDB;
K 索引就是普通索引,除了主鍵以外的索引都是普通索引。code
普通索引由於行記錄裏沒有數據的所有信息,在使用普通索引查詢時,須要如今普通索引樹上搜索一遍,再回到主鍵索引樹上查詢到須要的信息,這個過程也叫回表。
可能回表不太好理解,我引用極客時間《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 相關文章,若有雷同,請多多包涵了。原創不易,碼字不易,還但願你們多多支持。若文中有所錯誤之處,還望提出,謝謝。
歡迎掃碼關注微信公衆號:「平頭哥的技術博文」,和平頭哥一塊兒學習,一塊兒進步。