索引的深入理解

索引定義

數據庫索引,是數據庫管理系統(DBMS)中一個排序的數據結構,以協助快速查詢、
更新數據庫表中數據。


在 InnoDB 裏面,索引類型有三種,普通索引、唯一索引(主鍵索引是特殊的唯一
索引)、全文索引。
1.普通(Normal):也叫非唯一索引,是最普通的索引,沒有任何的限制。
2.唯一(Unique):唯一索引要求鍵值不能重複。另外需要注意的是,主鍵索引是一
種特殊的唯一索引, 要求鍵值不能爲空
。 主鍵索引用 primay key
創建。
3.全文(Fulltext):針對比較大的數據,比如我們存放的是消息內容,有幾 KB 的數
據的這種情況,如果要解決 like 查詢效率低的問題,可以創建全文索引。只有文本類型
的字段纔可以創建全文索引,比如 char、varchar、text。

create table m3 (
name varchar(50),
fulltext index(name)
);

平衡二叉樹(AVL樹)

動畫展示 https://www.cs.usfca.edu/~galles/visualization/AVLtree.html
定義:左右子樹深度差絕對值不能超過 1
通過左旋和右旋變平衡
插入3時左旋
存儲三塊的內容:
第一個是索引的鍵值。比如我們在 id 上面創建了一個索引,我在用 where id =1 的
條件查詢的時候就會找到索引裏面的 id 的這個鍵值。
第二個是數據的磁盤地址,因爲索引的作用就是去查找數據的存放的地址。
第三個,因爲是二叉樹,它必須還要有左子節點和右子節點的引用,這樣我們才能
找到下一個節點。比如大於 26 的時候,走右邊,到下一個樹的節點,繼續判斷。

在這裏插入圖片描述


多路平衡查找樹(B樹)

特點:分叉數(路數)永遠比關鍵字數多 1
在這裏插入圖片描述


加強版多路平衡查找樹(B+樹)

在這裏插入圖片描述
MySQL 中的 B+Tree 有幾個特點:
1、它的關鍵字的數量是跟路數相等的;
2、B+Tree 的根節點和枝節點中都不會存儲數據,只有葉子節點才存儲數據。搜索
到關鍵字不會直接返回,會到最後一層的葉子節點。比如我們搜索 id=28,雖然在第一
層直接命中了,但是全部的數據在葉子節點上面,所以我還要繼續往下搜索,一直到葉
子節點。


實例

舉個例子:假設一條記錄是 1K,一個葉子節點(一頁)可以存儲 16 條記錄。非葉
子節點可以存儲多少個指針?
假設索引字段是 bigint 類型,長度爲 8 字節。指針大小在 InnoDB 源碼中設置爲
6 字節,這樣一共 14 字節。非葉子節點(一頁)可以存儲 16384/14=1170 個這樣的
單元(鍵值+指針),代表有 1170 個指針。
樹 深 度 爲 2 的 時 候 , 有 1170^2 個 葉 子 節 點 , 可 以 存 儲 的 數 據 爲
1170117016=21902400。
在這裏插入圖片描述

在查找數據時一次頁的查找代表一次 IO,也就是說,一張 2000 萬左右的表,查詢
數據最多需要訪問 3 次磁盤。
所以在 InnoDB 中 B+ 樹深度一般爲 1-3 層,它就能滿足千萬級的數據存儲。

InnoDB 中的 B+Tree 的特點

1)它是 B Tree 的變種,B Tree 能解決的問題,它都能解決。B Tree 解決的兩大問題
是什麼?(每個節點存儲更多關鍵字;路數更多)
2)掃庫、掃表能力更強(如果我們要對錶進行全表掃描,只需要遍歷葉子節點就可以
了,不需要遍歷整棵 B+Tree 拿到所有的數據)
3) B+Tree 的磁盤讀寫能力相對於 B Tree 來說更強(根節點和枝節點不保存數據區,
所以一個節點可以保存更多的關鍵字,一次磁盤加載的關鍵字更多)
4)排序能力更強(因爲葉子節點上有下一個數據區的指針,數據形成了鏈表)
5)效率更加穩定(B+Tree 永遠是在葉子節點拿到數據,所以 IO 次數是穩定的)

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