一文讀懂 MySQL 索引

1 索引簡介1.1 什么是 MySQL 的索引官方定義:索引是幫助 MySQL 高效獲取數據的數據結構
從上面定義中我們可以分析出索引本質是一個數據結構,他的作用是幫助我們高效獲取數據,在正式介紹索引前 , 我們先來了解一下基本的數據結構
2 索引數據結構2.1Hash 索引Hash 索引是比較常見的一種索引,他是通過計算出記錄對應的 hash 值,然后根據計算結果,存儲在對應位置 。查詢的時候也是根據 hash 值快速找到位置 。他的單條記錄查詢的效率很高,時間復雜度為1 。但是,Hash索引并不是最常用的數據庫索引類型,尤其是我們常用的Mysql Innodb引擎就是不支持hash索引的 。
hash 索引在等值查詢時速度很快,但是有以下兩個問題

  • 不支持范圍查詢
  • hash 沖突,當兩條記錄的 hash 值相同時,就產生了 hash 沖突,需要在后面用鏈表存儲起來

一文讀懂 MySQL 索引

文章插圖
2.2 二叉樹2.2.1 經典二叉樹1、一個節點只能有兩個子節點
2、左子節點的值小于父親節點值,右子節點的值大于父親節點的值,采用二分查找,速度較快
一文讀懂 MySQL 索引

文章插圖
經典二叉樹會出現一個極端例子,就是鏈表,節點數據越來越大 。這種情況下 , 二叉樹搜索性能就會降低
一文讀懂 MySQL 索引

文章插圖
2.2.2 平衡二叉樹平衡二叉樹又稱AVL樹 。它可以是一顆空樹,或者具有以下性質的二叉排序樹:
  • 它的左子樹和右子樹的高度之差(平衡因子)的絕對值不超過1
  • 它的左子樹和右子樹都是一顆平衡二叉樹 。
數字 1-6 在平衡二叉樹中圖示如下:
一文讀懂 MySQL 索引

文章插圖
2.3 B 樹B樹屬于多叉樹又名平衡多路查找樹,可以有多叉,有如下特點
(1)排序方式:所有節點關鍵字是按遞增次序排列,并遵循左小右大原則;
(2)子節點數:非葉節點(根節點和枝節點)的子節點數 >1、且子節點數量<=M 、且M>=2,空樹除外(注:M階代表一個樹節點最多有多少個查找路徑,M=M路,當M=2則是2叉樹,M=3則是3叉);
(3)關鍵字數:枝節點的關鍵字數量大于等于ceil(m/2)-1個且小于等于M-1個(注:ceil()是個朝正無窮方向取整的函數 如ceil(1.1)結果為2);
(4)所有葉子節點均在同一層、葉子節點除了包含了關鍵字 和 關鍵字記錄的指針外,也有指向其子節點的指針只不過其指針地址都為null對應下圖最后一層節點的空格子;
一文讀懂 MySQL 索引

文章插圖
MySQL 中 B 樹存儲結構如下:
一文讀懂 MySQL 索引

文章插圖
2.4 B+ 樹B+樹是在B樹的基礎上又一次的改進,其主要對兩個方面進行了提升,一方面是查詢的穩定性 , 另外一方面是在數據排序方面更友好 。MySQL 索引的底層數據結構采用的就是 B+ 樹
(1)B+樹的非葉子節點不保存具體的數據 , 而只保存關鍵字的索引,而所有的數據最終都會保存到葉子節點 。因為所有數據必須要到葉子節點才能獲取到,所以每次數據查詢的次數都一樣,這樣一來B+樹的查詢速度也就會比較穩定,而B樹的查找過程中,不同的關鍵字查找的次數很有可能都是不同的(有的數據可能在根節點 , 有的數據可能在最下層的葉節點),所以在數據庫的應用層面,B+樹就顯得更合適 。
(2)B+樹葉子節點的關鍵字從小到大有序排列,左邊結尾數據都會保存右邊節點開始數據的指針 。因為葉子節點都是有序排列的 , 所以B+樹對于數據的排序有著更好的支持 。
一文讀懂 MySQL 索引

文章插圖
2.5 B* 樹【一文讀懂 MySQL 索引】B樹是B+樹一種變形,它是在B+樹的基礎上,將索引層以指針連接起來(B+ 樹只是將數據層用指針連接起來),使搜索取值更加快捷
一文讀懂 MySQL 索引

文章插圖
總結
分析了以上幾種數據結構,MySQL 采用的是 B+ 樹來存儲索引 , 綜合層面來說,這樣查詢效率最好 。oracle 采用的是 B* 樹
3 索引分類MySQL 索引主要有以下幾種
  • 主鍵索引
  • 唯一索引
  • 普通索引
  • 組合索引
  • 全文索引
3.1 主鍵索引主鍵索引是比較特殊的索引,一般在建表時會給表設置一個主鍵,MySQL 會默認給這個主鍵加上索引 。主鍵索引葉子節點存儲的是數據表的某一行數據 。當表沒有創建主鍵索引是,InnDB 會自動創建一個 ROWID 字段用于構建聚簇索引 。規則如下:

推薦閱讀