MySQL索引底層實現(張高偉)

2021-08-02 14:17:04 字數 1500 閱讀 2841

索引的本質

mysql官方對於索引的定義為:索引是幫助mysql高效獲取資料的資料結構。即可以理解為:索引是資料結構。

我們知道,資料庫查詢是資料庫最主要的功能之一,我們都希望查詢資料的速度盡可能的快,因此資料庫系統的設計者會從查詢演算法的角度進行優化。最基本的查詢演算法當然是順序查詢,當然這種時間複雜度為o(n)的演算法在資料量很大時顯然是糟糕的,於是有了二分查詢、二叉樹查詢等。但是二分查詢要求被檢索資料有序,而二叉樹查詢只能應用於二叉查詢樹,但是資料本身的組織結構不可能完全滿足各種資料結構。所以,在資料之外,資料庫系統還維護者滿足特定查詢演算法的資料結構,這些資料結構以某種方式引用資料,這樣就可以在這些資料結構上實現高階查詢演算法。這種資料結構,就是索引。

b-tree和b+tree

目前大部分資料庫系統及檔案系統都採用b-tree和b+tree作為索引結構。

索引 索引的目的:提高查詢效率

原理:通過不斷的縮小想要獲得資料的範圍來篩選出最終想要的結果,同時把隨機的事件變成順序的事件,也就是我們總是通過同一種查詢方式來鎖定資料。

資料結構:b+樹

**b+樹與查詢過程:

如上圖,是一顆b+樹,關於b+樹的定義可以參見b+樹,這裡只說一些重點,淺藍色的塊我們稱之為乙個磁碟塊,可以看到每個磁碟塊包含幾個資料項(深藍色所示)和指標(黃色所示),如磁碟塊1包含資料項17和35,包含指標p1、p2、p3,p1表示小於17的磁碟塊,p2表示在17和35之間的磁碟塊,p3表示大於35的磁碟塊。真實的資料存在於葉子節點即3、5、9、10、13、15、28、29、36、60、75、79、90、99。非葉子節點只不儲存真實的資料,只儲存指引搜尋方向的資料項,如17、35並不真實存在於資料表中。

b+樹的查詢過程

如圖所示,如果要查詢資料項29,那麼首先會把磁碟塊1由磁碟載入到記憶體,此時發生一次io,在記憶體中用二分查詢確定29在17和35之間,鎖定磁碟塊1的p2指標,記憶體時間因為非常短(相比磁碟的io)可以忽略不計,通過磁碟塊1的p2指標的磁碟位址把磁碟塊3由磁碟載入到記憶體,發生第二次io,29在26和30之間,鎖定磁碟塊3的p2指標,通過指標載入磁碟塊8到記憶體,發生第三次io,同時記憶體中做二分查詢找到29,結束查詢,總計三次io。真實的情況是,3層的b+樹可以表示上百萬的資料,如果上百萬的資料查詢只需要三次io,效能提高將是巨大的,如果沒有索引,每個資料項都要發生一次io,那麼總共需要百萬次的io,顯然成本非常非常高。

b+樹性質

通過上面的分析,我們知道io次數取決於b+數的高度h,假設當前資料表的資料為n,每個磁碟塊的資料項的數量是m,則有h=㏒(m+1)n,當資料量n一定的情況下,m越大,h越小;而m = 磁碟塊的大小 / 資料項的大小,磁碟塊的大小也就是乙個資料頁的大小,是固定的,如果資料項佔的空間越小,資料項的數量越多,樹的高度越低。這就是為什麼每個資料項,即索引欄位要盡量的小,比如int佔4位元組,要比bigint8位元組少一半。這也是為什麼b+樹要求把真實的資料放到葉子節點而不是內層節點,一旦放到內層節點,磁碟塊的資料項會大幅度下降,導致樹增高。當資料項等於1時將會退化成線性表。

mysql索引實現 mysql索引底層實現原理

一 定義 索引定義 索引 index 是幫助mysql高效獲取資料的資料結構。本質 索引是資料結構。二 b tree m階b tree滿足以下條件 1 每個節點至多可以擁有m棵子樹。2 根節點,只有至少有2個節點 要麼極端情況,就是一棵樹就乙個根節點,單細胞生物,即是根,也是葉,也是樹 3 非根非葉...

MySQL索引底層實現

索引的本質 mysql官方對於索引的定義為 索引是幫助mysql高效獲取資料的資料結構。即可以理解為 索引是資料結構。我們知道,資料庫查詢是資料庫最主要的功能之一,我們都希望查詢資料的速度盡可能的快,因此資料庫系統的設計者會從查詢演算法的角度進行優化。最基本的查詢演算法當然是順序查詢,當然這種時間複...

MySQL索引底層實現

可以通過sql語句檢視索引 mysql中常見的引擎之myisamdata存的是資料位址.索引是索引,資料是資料.索引放在xx.myi檔案中,資料放在xx.myd檔案中,所以也叫非聚集索引 mysql中常見的引擎之innodb data存的是資料本身.索引也是資料.資料和索引存在乙個xx.idb檔案中...