MySQL調優之索引的資料結構B 樹

2021-10-05 11:27:14 字數 1811 閱讀 7259

為什麼用 b+ 樹

innodb 和 myisam 的區別

參考資料

mysql調優之效能監控

mysql調優系列之執行過程

雜湊表、完全平衡二叉樹、b樹、b+樹都可以優化查詢,為何mysql使用b+樹?

利用hash儲存的話需要將所有的資料檔案新增到記憶體,比較耗費記憶體空間

如果所有的查詢都是等值查詢,那麼hash確實很快,但是在企業或者實際工作環境中範圍查詢的資料更多,而不是等值查詢,因此hash就不太適合了

b 樹的特點:

所有鍵值分布在整顆樹中

搜尋有可能在非葉子結點結束,在關鍵字全集內做一次查詢,效能逼近二分查詢

每個節點最多擁有m個子樹

根節點至少有2個子樹

分支節點至少擁有m/2顆子樹(除根節點和葉子節點外都是分支節點)

所有葉子節點都在同一層、每個節點最多可以有m-1個key,並且以公升序排列

舉個例子:

例項圖說明:

查詢關鍵字 28 過程:

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

比較關鍵字 28 在區間(16,34),找到磁碟塊 1 的指標 p2。

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

比較關鍵字 28 在區間(25,31),找到磁碟塊 3 的指標 p2。

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

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

缺點:

b+tree是在btree的基礎之上做的一種優化,變化如下:

為了降低樹的高度

將資料範圍變為多個區間,區間越多,資料檢索越快

非葉子節點儲存key,葉子節點儲存key和資料

葉子節點兩兩指標相互連線(符合磁碟的預讀特性),順序查詢效能更高

舉個例子:

注意:在b+tree上有兩個頭指標,乙個指向根節點,另乙個指向關鍵字最小的葉子節點,而且所有葉子節點(即資料節點)之間是一種鏈式環結構。

因此可以對 b+tree 進行兩種查詢運算:一種是對於主鍵的範圍查詢和分頁查詢,另一種是從根節點開始,進行隨機查詢。

注意:

innodb是通過b+tree結構對主鍵建立索引,然後葉子節點中儲存記錄,如果沒有主鍵,那麼會選擇唯一鍵,如果沒有唯一鍵,那麼會生成乙個6位的row_id來作為主鍵

如果建立索引的鍵是其他字段,那麼在葉子節點中儲存的是該記錄的主鍵,然後再通過主鍵索引找到對應的記錄,叫做回表myisam 葉子節點中儲存的是位址

mysql調優(一)索引結構

2 聚集索引與非聚集索引 3 什麼是回表 4 什麼是索引覆蓋 解決回表的方法 5 uuid與自增int型id效能上對比 mysql的基本儲存結構是頁 記錄都存在頁裡面 各個資料頁可以組成乙個雙向鍊錶,每個資料頁都會為儲存在它裡面的記錄生成乙個頁目錄,每個資料頁中的內容又可以組成乙個單向鍊錶。在中in...

MySql效能調優 索引

在對mysql的查詢語句優化過程中,我們最常用的手段就是新增索引,可見索引對資料庫優化的重要性,下面就說一說在優化過程中,索引的一些用法,鑑於本人水平有限,可能會有一些說得不對的地方,歡迎指正。下面例子中需要使用1張表,表結構如下 create table order order id int 11...

剖析資料庫效能調優技術之索引調優

剖析資料庫效能調優技術之索引調優 2008 1 28 9 37 00 by iulu 一 概述 隨著資料庫在各個領域的使用不斷增長,越來越多的應用提出了高效能的要求。資料庫效能調優是知識密集型的學科,需要綜合考慮各種複雜的因素 資料庫緩衝區的大小 索引的建立 語句改寫等等。總之,資料庫效能調優的目的...