MySQL中的幾種索引介紹

索引是加快我們查找數據的利器,MySQL中的索引有很多種類型,它們是在存儲引擎層實現的,這意味着不同的存儲引擎支持的索引類型可能不同,即使相同,底層工作原理也可能不同 (關於存儲引擎在在前幾天的文章裏有介紹),我們這裏以索引類型分類,分別介紹一下幾種常見的索引。

B+TREE索引

這是InnoDB的默認索引類型,我們常聽人說MySQL的B-TREE索引,其實MySQL的B樹索引就是B+樹。學習B+樹之前我們先來簡單的看下B樹。

B樹類似於二叉查找樹(關於二叉樹,查找樹這些基礎的這裏就不介紹了),能夠讓查找數據、順序訪問、插入數據及刪除的動作,在最差的情況下也都能在對數時間內完成。

上圖是一顆簡單的B樹,可見它與二叉樹最大的區別是它允許一個節點有多於2個的元素,每個節點都包含key和數據,查找時我們可以使用二分的方式快速搜索數據。

我們再來看B+樹

可以看到,與B樹最大的區別就是每一個葉子結點都包含指向下一個葉子結點的指針,並且葉子結點的指針指向的是被索引的數據,而非其他的節點頁,非葉節點僅具有索引作用,跟數據有關的信息均存儲在葉節點中,查找時存儲引擎通過根節點一層層的進行二分搜索即可。由於B+樹在內部節點上不包含數據信息,所以它佔用空間更小;葉子節點之間形成鏈表,從而方便了葉子結點的遍歷與範圍查找。

雖然都是B+樹索引,但是存儲引擎使用它們的方式不同,以我們最常用的倆個引擎爲例,在MyISAM中以前綴壓縮技術使得索引佔用更小並通過數據的物理位置引用被索引的行,而在InnoDB中則按原格式存儲並根據主鍵引用被索引的行。

HASH索引

哈希索引基於hash表實現,類似於Java中的HashMap,通過計算key的hash值映射對應的value,在不發生hash衝突的情況下時間複雜度爲常數級別,MySQL的hash索引會對所有的索引列計算一個hash碼,由於hash的索引的特點,它的缺點也顯而易見,只有精確匹配索引所有列的查詢纔有效,hash索引數據也並不是按照索引值順序存儲的,所以也無無法用於排序,只支持等值查詢,不支持範圍查詢。他是Memory引擎的默認索引類型,也是Memory引擎速度快的原因之一。

在InnoDB有一個特殊的功能叫做自適應哈希索引,當它發現某些索引值被使用的非常頻繁時,它會在內存中基於B+樹索引之上再創建一個hash索引,加快數據的查找速度。

全文索引

這是一種特殊類型的索引,它查找的是文本中的關鍵詞,而不是直接比較索引中的值,全文索引更類似於搜索引擎做的事情,實際生產中我們一般不會使用MySQL來做類似搜索引擎的工作。

要做搜索的話一般都是使用專業的搜索相關開源工具,從最早的solr到現在的Elasticsearch(主要通過倒排索引,分詞等來實現),它們的性能更好,功能也更加強大。

最後

瞭解索引的工作原理之後我們才能更好的使用索引,優化索引,以後有時間再寫MySQL常用的索引優化策略。

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