面試官常考的MySQL索引(MySQL進階)

你好我是辰兮,很高興你能來閱讀,本篇是整理了索引基礎學習的相關知識點,帶你認識瞭解索引的數據結構,實現原理,分享獲取新知,希望對你有幫助,一起加油,共同進步。



一、索引定義

MySQL官方定義:索引(Index)是幫助MySQL高效獲取數據的數據結構。

作用: 可以提高查詢效率。

關鍵詞:數據結構 用來提高查詢效率


二、索引分類

索引是在存儲引擎中實現的,也就是說不同的存儲引擎,會使用不同的索引。MyISAM和InnoDB存儲引擎:只支持BTREE索引,也就是說默認使用BTREE,不能夠更換。MEMORY/HEAP存儲引擎:支持HASH和BTREE索引。

mysql的索引我們分爲三大類來講單列索引(普通索引,唯一索引,主鍵索引)、組合索引、全文索引。

索引名稱 作用
主鍵索引 主鍵是一種唯一性索引,但它必須指定爲PRIMARY KEY,每個表只能有一個主鍵
唯一索引 索引列的所有值都只能出現一次,即必須唯一,值可以爲空
普通索引 基本的索引類型,值可以爲空,沒有唯一性的限制
全文索引 全文索引的索引類型爲FULLTEXT
  • 全文索引可以在varchar、char、text類型的列上創建。可以通過ALTER TABLE或CREATE INDEX命令創建。
  • 對於大規模的數據集,通過ALTER TABLE(或者CREATE INDEX)命令創建全文索引要比把記錄插入帶有全文索引的空表更快。
  • 全文索引不支持中文需要借sphinx(coreseek)或迅搜<、code>技術處理中文。
  • alter table 表名 add FULLTEXT(字段名);

三、索引原理

(1)爲什麼我們添加完索引後查詢速度會變快?

  • ①傳統的查詢方法,是按照表的順序遍歷的,不論查詢幾條數據,mysql需要將表的數據從頭到尾遍歷一遍
  • ②在我們添加完索引之後,mysql一般通過BTREE算法生成一個索引文件,在查詢數據庫時,找到索引文件進行遍歷(折半查找大幅查詢效率),找到相應的鍵從而獲取數據

在這裏插入圖片描述

(2)索引的代價

  • ①創建索引是會產生索引文件的,佔用磁盤空間
  • ②索引文件是一個二叉樹類型的文件,可想而知我們的dml(增刪改)操作同樣也會對索引文件進行修改,所以性能會下降

(3)在哪些column上使用索引?

  • 較頻繁的作爲查詢條件的字段應該創建索引
  • 唯一性太差的字段不適合創建索引(例如gender性別字段,儘管頻繁作爲查詢條件)
  • 更新非常頻繁的字段不適合作爲索引
  • 不會出現在where子句中的字段不該創建索引

四、索引數據結構

實際的數據庫系統幾乎沒有使用二叉查找樹或其進化品種紅黑樹(red-black tree)實現的,目前大部分數據庫系統及文件系統都採用B-Tree或其變種B+Tree作爲索引結構。

(1)B-Tree

B樹(Balance)是一種自平衡的樹,能夠保持數據有序。這種數據結構能夠讓查找數據、順序訪問、插入數據及刪除的動作,都在對數時間內完成。

概括來說B樹是一個一般化的二叉查找樹(binary search tree),可以擁有多於2個子節點。B樹爲系統大塊數據的讀寫操作做了優化。B樹減少定位記錄時所經歷的中間過程,從而加快存取速度。

下面是一個B-Tree的數據結構:

在這裏插入圖片描述

B-Tree是滿足下列條件的數據結構:

  • B-Tree的每個節點都是【指針+“鍵值對”】組成,key和指針互相間隔,節點兩端是指針
  • 每個非葉子節點由n-1個key和n個指針組成,每個葉子節點最少包含一個key和兩個指針
  • 每個指針要麼爲null,要麼指向另外一個節點,葉子節點的指針均爲null 一個節點中的key從左到右遞減排列
  • 指針指向的節點的所有key大於指針左邊的key,小於指針右邊的key 所有的葉子節點具有相同的深度,等於樹高h(樹高,就是樹的層數)

在B-Tree中按key檢索數據的算法:首先從根節點進行二分查找,如果找到則返回對應節點的data,否則對相應區間的指針指向的節點遞歸進行查找,直到找到節點或找到null指針,返回null則表示查找失敗。

  • 一個度爲d的B-Tree,設其索引N個key,則其樹高h的上限爲logd((N+1)/2),檢索一個key,其查找節點個數的漸進複雜度爲O(logdN)。從這點可以看出,B-Tree是一個非常有效率的索引數據結構。
  • 【度,用來約束一個節點key和指針的個數,每個非葉子結點由n-1個key和n個指針組成,其中d<=n<=2d,由於key的個數至少爲1,所以d>=2】

(2)B+Tree

B+Tree是B樹最常見的的一種變種(B-Tree有許多變種),MySQL就普遍使用B+Tree實現其索引結構。

在這裏插入圖片描述

與B-Tree相比,B+Tree有以下不同點:

  • B+樹的每個非葉子節點都是由【key+指針】,B樹是【鍵值對+指針】
  • B+樹的每個葉子節點只包含鍵值對,B樹的葉子節點【鍵值對+指針】
  • B+樹的每個非葉子節點的指針的數量等於key的數量,B樹(指針數量=鍵值對數量+1)
  • B+樹的葉子節點包含所有的key

一般在數據庫系統或文件系統中使用的B+Tree結構都在經典B+Tree的基礎上進行了優化,增加了順序訪問指針。

在這裏插入圖片描述

在B+Tree的每個葉子節點增加一個指向相鄰葉子節點的指針,就形成了帶有順序訪問指針的B+Tree。做這個優化的目的是爲了提高區間訪問的性能,例如圖4中如果要查詢key爲從18到49的所有數據記錄,當找到18後,只需順着節點和指針順序遍歷就可以一次性訪問到所有數據節點,極大提到了區間查詢效率。

MySQL B+Tree索引解析圖

在這裏插入圖片描述


The best investment is to invest in yourself

在這裏插入圖片描述

2020.06.12 記錄辰兮的第80篇博客

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