mysql兩種常用引擎的區別和索引的底層原理

2021-09-26 09:58:12 字數 3823 閱讀 8832

一、mysql 兩個常用引擎對比

二、mysql的索引

1、 啥是索引

索引是一種用來實現 mysql 高效獲取資料的資料結構(索引是資料結構)。

建立索引就是 mysql 對相關欄位以索引這種資料結構來儲存,然後查詢的時候就有對應的查詢演算法。索引採用一些查詢演算法優化查詢,比如二分查詢、快速查詢、順序查詢等,顯然不同的演算法所要求的資料結構也不同,順序查詢和二分查詢要求資料勁量有序、折半查詢則用於二叉樹或者紅黑樹結果上。在這種情況下,mysql系統就維護了一套指向不同演算法的資料結構,而這種資料結構就是索引。

2、 常用的索引結構: b-tree

1)二叉樹相關概念

結點是資料結構中的基礎,是構成複雜資料結構的基本組成單位。

結點擁有的子樹數目稱為結點的

樹中結點的最大層次數稱為樹的深度高度

二叉樹是每個結點最多有兩個子樹的樹結構。通常子樹被稱作左子樹和右子樹。每個節點最多有兩棵子樹,即二叉樹不存在度大於2的節點。二叉樹的子樹有左右之分,其子樹的次序不能顛倒。

2)b-tree(b樹)

(1) b樹相關概念

b樹事實上是一種自平衡(所有的葉子節點擁有相同的高度)的多叉查詢樹,其每乙個結點的孩子數可以多於兩個,且每個結點出可以儲存多個元素,每個元素之間都存在一定的順序。

為什麼資料庫要用b樹:

a、平衡二叉樹的查詢效率為o(log2n)與樹的深度相關,通過降低樹的深度,可 以提高查詢效率,但是還有乙個瓶頸就是,每次查詢一次就只能得到乙個節點元素,它    無法一次得到多個節點元素,無法在同樣的高度查詢更多的元素。

b、b樹能容納更多的資料,並且b樹的高度是可以控制的,而二叉樹是不可以的, b樹能更加方便得讓子節點存放在硬碟,所以b樹能減少機械磁碟的磁頭跳轉的次數,b 樹更加適合大量資料動態操作,因此很多資料庫使用b+樹來實現儲存和檢索。

b樹的階:b樹中所有結點中孩子結點個數的最大值成為b樹的階,通常用m表示。

m階b樹:b樹開m個子節點(m>=2),稱之為m階b樹。

m階b樹有以下特性:

a、每個節點至多可以擁有m棵子樹,每棵樹以及每棵樹中的關鍵字都是有序的。

b、根節點,只有至少有2個節點(或者就只有乙個根節點)。

c、非根非葉的節點至少有的ceil(m/2)個子樹(ceil表示向上取整)。

d、根結點中關鍵字的個數為1 至 m-1,比節點數目少乙個;非根結點的關鍵字個數最多為 m-1;非根節點含有n個關鍵字就有n+1個子節點;非跟節點關鍵字取值範圍ceil(m/2) -1<= n <=m-1

e、從根到葉子的每一條路徑都有相同的長度,也就是說,葉子節點在同一層。

f、關鍵字集合分布在整顆樹中,任何乙個關鍵字出現且只出現在乙個節點中。

(2)b-tree(b樹)查詢

b樹的查詢過程和二叉排序樹比較類似,從根節點依次比較每個結點,因為每個節點中的關鍵字和左右子樹都是有序的,所以只要比較節點中的關鍵字,或者沿著指標就能很快地找到指定的關鍵字,如果查詢失敗,則會返回葉子節點,即空指標。

具體操作:

a、先讓key與根結點中的關鍵字比較,如果key等於k[i](k為結點內的關鍵字陣列),則查詢成功;

b、若keyk[n],則道p[n]所指示的子樹中繼續查詢。

d、若k[i]3)b+樹

(1)b+樹相關概念

b+樹是b樹的公升級版

a、具有n個關鍵字的結點有n個分支(在b樹種,含有n個關鍵字就有n+1個子節點)。

b、所有的關鍵字全部儲存在葉子節點上,且葉子節點本身根據關鍵字自小而大順序連線。

c、非葉子節點可以看成索引部分,節點中僅含有其子樹中的最大(或最小)關鍵字和指向子節點的指標。

**d、**每個結點(除根結點外)中的關鍵字個數n的取值為ceil(m/2) <= n <=m,根結點的取值範圍為1<=n<=m。

(2)b+樹查詢

b+樹的查詢過程與b樹類似但也有區別,區別在於如果在非葉子節點上的關鍵字等於key,並不直接返回,而是繼續沿著指標直到葉子節點位置繼續查詢,每次查詢都是走了一條從根到葉子節點的路徑。

(3)使用b+樹的原因(紅黑樹也帶索引,為啥不用紅黑樹)

索引是儲存在磁碟上的,索引查詢過程中就要從磁碟獲取資料(i/o操作),所以要想提高效率就要優化索引的結構組織,儘量減少查詢過程中磁碟i/o的訪問次數。在資料庫設計中將乙個節點的大小設為等於乙個頁,這樣每個節點只需要一次i/o就可以完全載入。

在b+樹中,d(節點的度)很大,h(樹的深度)一般很小,每次檢索最多訪問h個節點,所以i/o次數就會很少,效率就高。

在紅黑樹中,d(節點的度)很小,h(樹的深度)一般很大,每次檢索最多訪問h個節點,所以i/o次數就會很大,效率就小。

三、mysql索引的實現

1、myisam索引實現

myisam引擎使用b+tree作為索引結構。

在葉子節點中儲存的是資料的位址。

2、innodb索引實現

innodb也使用b+tree作為索引結構,這棵樹的葉子節點data域儲存了完整的資料記錄,其具體實現方式與myisam缺不相同。

innodb與myisam最大的區別是將整條資料存在葉子節點,而不是位址。(葉子節點存的是主鍵索引和資料資訊)

3、總結:

myisam

主鍵索引/非主鍵索引:葉子節點上均帶有行號,通過行號進行索引

myisam屬於堆表,資料寫入一直累積;此時寫入效能比innodb好,但是無論是主鍵查詢還是非主鍵查詢,都不可避免的需要二次io。

innodb

主鍵索引(聚簇索引):葉子節點上帶有資料

非主鍵索引(第二索引):葉子節點上帶有主鍵id

innodb屬於索引組織表,在主鍵索引情況下,主鍵查詢時只需要一次io即可返回所有想要的資料,在非主鍵索引查詢時如果在索引內不能完成查詢記錄返回則需要多次的io ;另外為了保證資料有序,innodb的插入是比較麻煩的。

MySQL兩種引擎的區別

innodb引擎提供了對資料庫acid事務的支援,並且實現了sql標準的四種隔離級別。該引擎還提供了行級鎖和外來鍵約束,它的設計目標是處理大容量資料庫系統,它本身其實就是基於mysql後台的完整資料庫系統,mysql執行時innodb會在記憶體中建立緩衝池,用於緩衝資料和索引。但是該引擎不支援ful...

Mysql 兩種引擎的區別

myisam與innodb的區別是什麼?1 儲存結構 myisam 每個myisam在磁碟上儲存成三個檔案。第乙個檔案的名字以表的名字開始,副檔名指出檔案型別。frm檔案儲存表定義。資料檔案的擴充套件名為.myd mydata 索引檔案的副檔名是.myi myindex innodb 所有的表都儲存...

Mysql的兩種引擎的區別

innodb引擎概述 innodb引擎提供了對資料庫acid事務的支援,並且實現了sql標準的四種隔離級別。該引擎還提供了行級鎖和外來鍵約束,它的設計目標是處理大容量資料庫系統,它本身其實就是基於mysql後台的完整資料庫系統,mysql執行時innodb會在記憶體中建立緩衝池,用於緩衝資料和索引。...