MySQL索引結構

2021-08-04 22:39:53 字數 1529 閱讀 7670

b-樹有如下特點:

所有鍵值分布在整顆樹中;

任何乙個關鍵字出現且只出現在乙個結點中;

搜尋有可能在非葉子結點結束;

在關鍵字全集內做一次查詢,效能逼近二分查詢;

b+樹是b-樹的變體,也是一種多路搜尋樹, 它與 b- 樹的不同之處在於:

所有關鍵字儲存在葉子節點出現,內部節點(非葉子節點並不儲存真正的 data)

為所有葉子結點增加了乙個鏈指標

簡化 b+樹 如下圖

紅黑樹等資料結構也可以用來實現索引,但是檔案系統及資料庫系統普遍採用b-/+tree作為索引結構。mysql 是基於磁碟的資料庫系統,索引往往以索引檔案的形式儲存的磁碟上,索引查詢過程中就要產生磁碟i/o消耗,相對於記憶體訪問,i/o訪問的消耗要高幾個數量級,索引的結構組織要儘量減少查詢過程中磁碟i/o的訪問次數。為什麼使用b-/+tree,還跟磁碟訪問原理有關。

由於磁碟的訪問速度與記憶體之間鴻溝,為了提高效率,要儘量減少磁碟i/o.磁碟往往不是嚴格按需讀取,而是每次都會預讀,磁碟讀取完需要的資料,會順序向後讀一定長度的資料放入記憶體。而這樣做的理論依據是電腦科學中著名的區域性性原理:

當乙個資料被用到時,其附近的資料也通常會馬上被使用

程式執行期間所需要的資料通常比較集中

由於磁碟順序讀取的效率很高(不需要尋道時間,只需很少的旋轉時間),因此對於具有區域性性的程式來說,預讀可以提高i/o效率.預讀的長度一般為頁(page)的整倍數。

mysql(預設使用innodb引擎),將記錄按照頁的方式進行管理,每頁大小預設為16k(這個值可以修改).linux 預設頁大小為4k

來自張洋的部落格:

實際實現b-tree還需要使用如下技巧:

每次新建節點時,直接申請乙個頁的空間,這樣就保證乙個節點物理上也儲存在乙個頁裡,加之計算機儲存分配都是按頁對齊的,就實現了乙個結點只需一次i/o。

假設 b-tree 的高度為 h,b-tree中一次檢索最多需要h-1次i/o(根節點常駐記憶體),漸進複雜度為o(h)=o(logdn)o(h)=o(logdn)。一般實際應用中,出度d是非常大的數字,通常超過100,因此h非常小(通常不超過3)。

而紅黑樹這種結構,h明顯要深的多。由於邏輯上很近的節點(父子)物理上可能很遠,無法利用區域性性,所以紅黑樹的i/o漸進複雜度也為o(h),效率明顯比b-tree差很多。

b+樹更適合外部儲存,由於內節點無 data 域,乙個結點可以儲存更多的內結點,每個節點能索引的範圍更大更精確,也意味著 b+樹單次磁碟io的資訊量大於b-樹,i/o效率更高。

mysql是一種關係型資料庫,區間訪問是常見的一種情況,b+樹葉節點增加的鏈指標,加強了區間訪問性,可使用在範圍區間查詢等,而b-樹每個節點 key 和 data 在一起,則無法區間

mysql多索引結構 MySQL 索引結構詳解

innodb的主鍵索引 primary key 是cluster形式的 聚簇索引 innodb的非主鍵索引 secondary index 是普通的b tree索引。兩種索引在root node和branch node是一樣的,在leaf node就不一樣了。primary key存放的是表的實際資...

mysql not 索引 MySQL 索引結構

為資料表增加索引 index 可以提公升mysql資料查詢效率。mysql中所有型別的資料字段都可以有索引。索引指向了資料表中的記錄 行 可以快速判斷某行記錄是否符合 where 語句中的限定條件。但是索引並不是越多越好 索引需要耗費儲存空間 索引越多,mysql在決定採用哪個索引時也會消耗更多時間...

mysql索引結構演變

索引 什麼是索引 索引是乙個排序的列表,在這個列表中儲存著索引的值和包含這個值的資料所在行的實體地址。當資料量十分龐大時,索引可以高效的獲取到資料所在的位址,而無需全表掃瞄,大大減少io次數。索引的分類 因為mysql支援多儲存引擎,如常用的innodb和myisam引擎,針對不同的引擎,會有不同的...