MySQL 索引講解

2021-10-24 21:15:41 字數 3023 閱讀 4709

索引是幫助mysql高效獲取資料的排好序的資料結構

索引的資料結構:

索引的節點儲存的是key(索引列欄位),value(行資料磁碟檔案的位址指標)。從索引表中找的時候,都是從根節點去找。(二叉樹的資料結構)

採取二分查詢的思想,o(logn) 的複雜度就可以完成對資料的查詢任務,查詢所需的最大次數等同於二叉樹的高度。

它的特性:

左子樹上所有節點的值,小於或等於根節點的值

右子樹上節點的值,大於或等於根節點的值

缺點:插入值時,可能會出現"單條腿長"的現象,導致多次插入新節點而不平衡的現象,這時紅黑樹就出現了。

也叫二叉平衡樹。說它平衡的意思就是,它不會變瘸子,左腿或右腿特別長的現象。

它的特性:

節點都是紅色或者黑色

根節點都是黑色

每個葉子的節點都是黑色空節點

每個紅色節點兩個子節點都是黑色的

從任意節點到每個葉子的所有路徑都包含相同的黑色節點

紅黑樹的高度雖然有一定的控制,而資料庫當中一般要把索引樹的高度控制在3-5層,這點紅黑樹顯然無法做到。

b-tree是為磁碟等外儲存裝置設計的一種平衡查詢樹,是一種多路平衡搜尋樹

不像紅黑樹只有2個子節點。既然有多個子節點,樹的高度就可以控制了,同時它也跟紅黑樹一樣,資料是排序的,可以快速查詢;

它的特性:

每個節點最多含有m個孩子

根節點含有[2,m]個孩子

非葉子節點含有[[m/2],m]個孩子節點(向上取整的意思)

所有葉子節點都在同一層

模擬查詢關鍵字29的過程

找到根節點找到磁碟塊1,讀入記憶體。【磁碟i/o操作第1次】

比較關鍵字29在區間(17,35),找到磁碟塊1的指標p2。

根據p2指標找到磁碟塊3,讀入記憶體。【磁碟i/o操作第2次】

比較關鍵字29在區間(26,30),找到磁碟塊3的指標p2。

根據p2指標找到磁碟塊8,讀入記憶體。【磁碟i/o操作第3次】

在磁碟塊8中的關鍵字列表中找到關鍵字29。

分析上面過程,發現需要3次磁碟i/o操作,和3次記憶體查詢操作。由於記憶體中的關鍵字是乙個有序表結構,可以利用二分法查詢提高效率。而3次磁碟i/o操作是影響整個b-tree查詢效率的決定因素

b+tree是在b-tree基礎上的優化innodb儲存引擎就是用b+tree實現其索引結構

b-tree的資料結構可以看出,每乙個頁的儲存空間是有限的,如果data資料較大時會導致每個節點儲存的key數量很小,但儲存的資料量很大時同樣會導致b-tree的深度較大,增大查詢時的磁碟i/o次數,影響查詢效率。

b+tree樹中,所有資料記錄點都是按照鍵值大小順序存放在同一層的葉子節點上,而非葉子節點只儲存key值資訊。這樣可以增大每個節點key值數量,降低b+tree的高度

b+tree與b-tree不同:

非葉子節點只儲存鍵值資訊

所有葉子節點之間有乙個鏈指標

所有記錄值都存放在葉子節點中

一般來說,索引本身也很大,不可能全部儲存在記憶體中,索引往往以索引檔案的形式儲存的磁碟上。索引查詢過程中就要產生磁碟i/o消耗,所以評價乙個資料結構作為索引的優劣最重要的指標就是在查詢過程中磁碟i/o操作次數的漸進複雜度。簡單說:索引的結構組織要儘量減少查詢過程中磁碟i/o的訪問次數。

對比上面的b+樹和紅黑樹,比如查詢節點21,紅黑樹要磁碟io5次,而b+樹只要2次,也就是說磁碟io次數大致為樹的高度,這樣b+樹就脫穎而出了。

b+tree的高度一般都在2 ~ 4層。mysql的innodb儲存引擎在設計時是將根節點常駐記憶體的,也就是說查詢某一鍵值的行記錄時最多隻需要1~3次磁碟i/o操作。

資料庫索引採用b+樹而不是b樹的主要原因:b+樹只要遍歷葉子節點就可以實現整棵樹的遍歷,而且在資料庫中基於範圍的查詢是非常頻繁的,而b樹只能中序遍歷所有節點,效率太低。

hash:雖然可以快速定位,但是沒有順序,io複雜度高。

二叉樹:樹的高度不均勻,不能自平衡,查詢效率跟資料有關(樹的高度),並且io代價高。

紅黑樹:樹的高度隨著資料量增加而增加,io代價高。

如果只選乙個資料,那確實是hash更快。但是資料庫中經常會選擇多條,這時候由於b+樹索引有序,並且又有鍊錶相連,它的查詢效率比hash就快很多了。

而且資料庫中的索引一般是在磁碟上,資料量大的情況可能無法一次裝入記憶體,b+樹的設計可以允許資料分批載入,同時樹的高度較低,提高查詢效率。

b+tree的特點,自增主鍵是連續的,在插入過程中儘量減少頁**,即使要進行頁**,也只會**很少一部分。並且能減少資料的移動,每次插入都是插入到最後。總之就是減少**和移動的頻率。

MySQL索引的講解

mysql 的鎖按照範圍可以分為全域性鎖 表鎖 行鎖,其中行鎖是由資料庫引擎實現的,並不是所有的引擎都提供行鎖,myisam 就不支援行鎖,所以文章介紹行鎖會以innodb引擎為例來介紹行鎖。mysql 提供全域性鎖來對整個資料庫例項加鎖。語法 flush tables with read lock...

mysql索引運用例項講解

官方定義 索引是幫助mysql高效獲取資料的資料結構,索引的本質是資料結構。在資料庫之外,資料庫系統還維護著滿足特定查詢演算法的資料結構,這些資料結構以某種方式引用 指向 資料,這樣就可以在這些資料結構上實現高階查詢演算法,這種資料結構就死索引 所使用的演算法是b樹演算法 為了加快col2的查詢,可...

Mysql索引的使用 詳細講解

1.索引的簡介 索引是對資料庫表中一列或多列的值進行排序的一種結構,使用索引可以提高資料庫中特定資料的查詢速度。2.索引的含義和特點 索引是乙個單獨的 儲存再磁碟上的資料庫結構,它們包含著對資料表裡所有記錄的引用指標。2.1索引的儲存引擎 索引是在儲存引擎中實現的,因此,每種儲存引擎的索引都不一定完...