為什麼用 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 一 概述 隨著資料庫在各個領域的使用不斷增長,越來越多的應用提出了高效能的要求。資料庫效能調優是知識密集型的學科,需要綜合考慮各種複雜的因素 資料庫緩衝區的大小 索引的建立 語句改寫等等。總之,資料庫效能調優的目的...