Mysql索引實現

2021-10-06 10:53:14 字數 1548 閱讀 2304

索引是幫助mysql高效獲取資料的排好序的資料結構,索引儲存在磁碟檔案裡

索引結構:二叉樹,紅黑樹,hash,btree

磁碟訪問原理:尋道時間(速度慢,費時),旋轉時間(速度較快),一般使用磁碟i/o次數評價索引結構的優劣

一般使用磁碟i/o次數評價索引結構的優劣。先從b-tree分析,根據b-tree的定義,可知檢索一次最多需要訪問h個節點。資料庫系統的設計者巧妙利用了磁碟預讀原理,將乙個節點的大小設為等於乙個頁,這樣每個節點只需要一次i/o就可以完全載入。為了達到這個目的,在實際實現b-tree還需要使用如下技巧:

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

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

綜上所述,用b-tree作為索引結構效率是非常高的。

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

b+樹更適合外部儲存(一般指磁碟儲存),由於內節點(非葉子節點)不儲存data,所以乙個節點可以儲存更多的內節點,每個節點能索引的範圍更大更精確。也就是說使用b+樹單次磁碟io的資訊量相比較b樹更大,io效率更高。

mysql是關係型資料庫,經常會按照區間來訪問某個索引列,b+樹的葉子節點間按順序建立了鏈指標,加強了區間訪問性,所以b+樹對索引列上的區間範圍查詢很友好。而b樹每個節點的key和data在一起,無法進行區間查詢。

btree結構圖特點:

度(degree)-節點的資料儲存個數

葉節點具有相同的深度

節點中的資料key從左到右遞增排列

b+tree結構圖特點:

非葉子節點不儲存data,只儲存key(主鍵),可以增大度

順序訪問指標,提高區間訪問的效能

1.mysql innodb的表必須有主鍵,主鍵建議用自增主鍵.如果使用uuid作為主鍵,插入資料時位置是不確定的,如果插入的位置那一頁滿了,會造成頁重組

2.mysql innodb的表非主鍵索引頁子節點儲存主鍵值(查詢過程會有乙個回表的過程),這樣做的目的提高一致性和節省儲存空間

資料結構動態圖:

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

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

mysql索引 mysql索引實現原理

什麼是索引 索引是一種高效獲取資料的儲存結構,例 hash 二叉 紅黑。mysql為什麼不用上面三種資料結構而採用b tree 若僅僅是 select from table where id 45 上面三種演算法可以輕易實現,但若是select from table where id 6 就不好使了...

Mysql索引實現

在mysql中,索引屬於儲存引擎級別的概念,不同儲存引擎對索引的實現方式是不同的,本文主要討論myisam和innodb兩個儲存引擎 mysql資料庫myisam和innodb儲存引擎的比較 的索引實現方式。myisam引擎使用b tree作為索引結構,葉結點的data域存放的是資料記錄的位址。下面...