索引原理-索引數據結構

推薦一個學習樹結構的網站 --> 樹結構學習網站

本文目錄:

  1. 二叉樹
  2. 紅黑樹
  3. Hash表
  4. B樹
  5. B+樹
  6. 巨簇索引
  7. 非巨簇索引
  8. 聯合索引

一. 二叉樹

插入順序: 4 2 1 10 6 7
首先, 左側葉子節點 < 主節點 < 右側葉子節點
我們亂序插入一些數據, 我們會發現0010這個節點被“孤立”了, 隨着數據量的增加樹的H(高度)會隨之增加, 當我們加到了N的數據量後, 我們再查詢這個N. 那麼這個樹搜索會從根直至到N這個位置, 對於自增的表列而言, 並沒有明顯提供查詢性能. 而且有些節點甚至可能會獨立存在, 拉高了樹的H.
在這裏插入圖片描述


二. 紅黑樹

插入順序: 4 2 1 10 6 7
我們會發現這棵樹, 在添加的過程中, 會字段平衡節點與葉子節點之間的關係, 當一側單向高時, 會把大於和小於的節點提上來, 左面是小於這個節點的, 右面是大於這個節點的, 它相比於二叉樹, 有了一個自動平衡的功能, 但是與二叉樹有一個相同的特點, 雖然數據量的增加樹的高度會無限增加. 所以數據庫的索引不會使用這個紅黑樹, 而JDK8的hashMap是數組+紅黑樹, 每個bucket內的紅黑樹節點數量也會有控制.
在這裏插入圖片描述

三. Hash表

Hash表的索引優缺點也顯而易見, 對於where條件之後的=查詢, 它是可以精確到桶的位置, 然後再看桶內數據哪條數據符合條件, 拿着地址去找數據.
但是缺點也很明顯, hash衝突, 如果鏈表數據過多, 反而失去了索引的該有的優勢, 而且它並不支持範圍查詢.
在這裏插入圖片描述

查看引擎的頁大小, 大約爲16K

在這裏插入圖片描述

四. B樹

B樹, 以自增主鍵舉例, 15,56,77,20,49就是id值, 每一個id值下面會掛着一條數據, 主節點和葉子節點是不能重複的.
在這裏插入圖片描述

五. B+樹

B+樹, B樹的升級版, 我們會發現相比於B樹, 主節點的值是可以和葉子節點重複的, 最終會定位到最終一行上, 獲取data數據. 而且data數據是一個雙向鏈表關係. 相比於B樹有什麼有數呢?

  1. 主節點來看 如果主鍵ID是bigint類型, 那麼它是8個字節, 白色的地方是指向葉子節點的地址, 在C語言中是6個字節, 那麼一對就是14byte, 以頁爲單位, 一個頁可以放16000/14=1143, 以H爲3爲例, 第二層的量爲1143 * 1143 = 1306449, 那麼第三層數據看成1KB, 那麼一個頁就是16條數據, H爲3的話就是 1143 * 1143 * 16, 大約就是兩千萬的數據量, 肯定比B數結構的量多的多(B樹 data以1KB算, 16000/1014=15 第二層才15*15).
  2. data雙向鏈表就決定了B+的數據可以範圍查詢, 而B樹有點類似與Hash表的查詢了(最後一行的數據是左小右大, 但是對於範圍來說查詢影響不大)
    在這裏插入圖片描述

六. 巨簇索引

我們先在服務器上安裝一個mysql, 創建一個test數據庫,
再創建一個 test_innodb的innoDB引擎的表
再創建一個test_myisam的MyISAM引擎的表
我們進入到 /var/lib/mysql路徑下, 會發現以數據庫命名的文件夾, 我們進到test目錄下
在這裏插入圖片描述
我們發現不同引擎的數據文件是不一樣的.
innoDB引擎的文件有frm和ibd, frm是表的結構數據, ibd是索引和數據的文件
MyISAM引擎的文件有frm和MYD以及MYI, frm仍然是表的結構數據, MYD是數據文件, MYI是索引數據文件.
不難發現, MyISAM將索引和數據解藕存儲, 但是每次查詢需要兩個文件聯查. 在數據量以及索引足夠大時MyISAM是佔優的, 但是在現如今硬件足夠優秀, 以及可以控制好樹的高度情況下, innoDB的效率也不會比MyISAM差. 甚至更優.







巨簇索引
通過mysql的數據文件, 我看可以看出來InnoDB的索引和數據都在.ibd文件裏, 那麼數據結構也就是如下, data數據就是行數據.
在這裏插入圖片描述
name字段創建B Tree索引
在巨簇索引存在下, 那麼再創建索引字段, 他的結構就如下所示, 最終指向了ID的值.
從這裏我們可以看出來, 創建一個錶帶上主鍵是多麼的重要!!!
爲什麼使用自增作爲主鍵? 如果是UUID這種, 那麼樹節點排序還需要計算ASCII值去比對. 相對於樹結構的特性自增是很好的選擇!!!

在這裏插入圖片描述





七. 非巨簇索引(MyISAM的主鍵索引)

我們查看數據庫的MyISAM的數據文件可以知道, 索引是MYI文件, 數據文件是MYD, 那麼他的結構也就是如下所示, data指向的是數據地址.
在這裏插入圖片描述

八. 聯合索引(左前綴原則)

節點排列我們知道一定是順序排列, 那麼如果是多個字段做聯合索引, 那麼它的排列一定是一個字段排序, 相同時第二個對比, 第二個也相同再比對第三個字段數據的ASCII值.
那麼我們就可以知道, 如果查詢where name = 'Bill’和where name = ‘Lilei’ and age = 30是可以走索引的
如果直接where position = 'dev’是無法走索引的
在這裏插入圖片描述


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