mysql索引全解 MySQL索引詳解

2021-10-17 21:58:10 字數 2611 閱讀 8052

概述

索引的本質就是幫助mysql高效獲資料排序的資料結構; mysql索引引擎主要包括innodb和myisam。根據索引節點是否包括資料,又區分為聚簇索引和非聚簇索引。本文將詳細講解mysql索引底層實現及相關注意事項。

索引資料結構

索引是排序好的資料結構,目的是幫助加快資料檢索過程。有很多資料結構均可以用做構建索引,如: 二叉樹、紅黑樹、hash表、b樹和b+樹等,下面將詳細介紹各種資料結構優缺點。

二叉樹二叉樹,準確說是二叉搜尋樹,如下圖所示,特點是:

1. 每個節點最多有兩個子節點

2. 左子樹節點資料小於父節點資料,右子樹節點資料大於父節點資料

其查詢效率為log(n),二叉搜尋樹主要有兩個缺點

1. 對於排序好的資料它會退化為線型搜尋,如下圖所示。

2. 二叉搜尋在索引節點多的情況下,樹會變的很高,查詢效率和樹的高度成正比,查詢效率急劇降低,且索引變的很龐大,不能載入到記憶體。

極端情況下退化為線型結構

紅黑樹紅黑樹本質上也是個二叉搜尋樹,只是做了各種限制使得二叉搜尋盡量達到平衡(任意節點的左右子樹的高度差不超過一定範圍),紅黑樹是近似平衡二叉搜尋樹,如下所示:

紅黑樹特點

1.每個節點黑色或者紅色

2.葉子nil為黑色

3.根節點為黑色

4.從乙個節點到其子孫葉子節點包含的黑色節點個樹一致

5.紅色節點必然有兩個黑色的子節點

紅黑色解決了二叉搜尋樹極端情況下退化為線型的問題,但是仍然存在樹過高索引過大的問題。

hash表

hash表將key進行hash計算然後對映到對應空間,在不考慮空間的情況下,能達到o(1)查詢效率,但是仍然會存在索引過大的問題。

b樹和b+樹

b樹和b+樹本質上就是個多路平衡查詢樹;以m路平衡查詢樹為例。

b樹特點

1. 根節點至少有乙個關鍵字

2. 每個節點最多有m-1個關鍵字

3. 非根節點最少有m/2個關鍵字

4. 所有葉子節點在同一層

5. 節點中的關鍵字是排序的

6. 節點包含索引和資料

b+樹特點

b+樹和b樹類似,主要區別:

1. 非葉子節點只儲存索引,資料儲存在葉子節點

2. 葉子節點在同一層,且包括所有的關鍵字,且葉子節點之間有序且用指標鏈結

如下圖所示:左側表示b樹,右側表示b+樹

b+樹的優點

b+樹在樹高度較低的情況下,也能儲存較大量的索引資料。假設樹高度h=3,每個節點記憶體預設大小16k,索引key為8位元組,指標為4位元組,則每個節點大約儲存16k / (8+4) = 1635 個key,3層樹滿的情況下,假設葉子節點索引加資料為32位元組,則每個葉子節點大約可以存放key個數等於16k / 32 = 512,總共葉子節點約存放key個數為1635*1635*512 = 1368691200

正是因為b+樹的優點,實際上mysql索引底層資料結構就是用的b+樹實現。

myisam和innodb

myisam和innodb底層實現都是b+樹。兩者索引和資料組織又有所不同,根據索引和資料是否都在葉子節點分為:聚簇索引和非聚簇索引

非聚簇索引

索引節點(b+樹葉子節點)資料域存放的是指向真實資料的位址,這種索引結構叫做非聚簇索引。

myisam索引就是非聚簇索引,因此檔案包括乙個索引檔案和乙個資料檔案。下圖為非聚簇索引示例:

聚簇索引

索引節點資料域存放的是實際的資料,這個索引叫做聚簇索引。

innodb索引型別為聚簇索引。如下圖所示:

主鍵索引和輔助索引

對於聚簇索引,主鍵索引資料行和主鍵存在一起;輔助鍵索引葉子節點存放的是輔助鍵和主鍵,因此通過輔助鍵查詢資料的時候,需要首先查詢輔助索引得到主鍵,然後查詢主鍵索引得到對應的資料;

對於非聚簇索引,主鍵索引節點存放的是主鍵和指向資料的指標,輔助索引節點存放的是輔助鍵和指向資料的指標;

如下所示,左邊表示innodb索引維護結構,右邊表示的myisam索引維護結構

以id為主鍵,name為輔助鍵

myisam和innodb主要區別innode支援事務, myisam不支援

innode資料儲存在共享表,myisam儲存在檔案myd和myi

innode支援表級鎖和行級鎖,myisam支援表級鎖

innodb支援崩潰後的恢復,myisam不支援

innodb支援外來鍵,myisam不支援;

innodb不支援全文索引,myisam支援全文索引;

innodb是聚簇索引,myisam是非聚簇索引;

其他問題

1)innodb以主鍵索引進行資料維護,因此必須要有主鍵,如果沒有定義系統會自動新增int型別主鍵;

2)innodb主鍵最好是int自增型別,原因是如果是其他字串型別占用空間大,節點存放的資料有限;自增原因是和構建b+樹節點**有關,如果是自增的那麼每次插入都是最後乙個葉子節點,使得樹**次數盡量少,這樣樹盡量高度低,提公升查詢效率;

3)innodb非主鍵索引資料域為啥存放的是主鍵而不是資料。是基於結果一致性和節省空間考慮。如果非主鍵索引資料域存放的是資料那麼一來空間浪費,同時如果主鍵索引資料變更,那麼非主鍵索引也要改變。

4)為啥用b+樹而不用b樹實現索引,原因主要是基於範圍查詢考慮,b+樹葉子節點是排序好的而且節點之間互相鏈結,因此對於範圍查詢非常高效。

mysql索引全解 mysql索引詳解

一 索引方法 mysql目前主要有以下幾種索引型別 fulltext,hash,btree,rtree。1.fulltext 即為全文索引,目前只有myisam引擎支援。其可以在create table alter table create index 使用,不過目前只有 char varchar ...

mysql 雜湊索引 MySQL索引之雜湊索引

雜湊索引 hash index 建立在雜湊表的基礎上,它只對使用了索引中的每一列的精確查詢有用。對於每一行,儲存引擎計算出了被索引的雜湊碼 hash code 它是乙個較小的值,並且有可能和其他行的雜湊碼不同。它把雜湊碼儲存在索引中,並且儲存了乙個指向雜湊表中的每一行的指標。在mysql中,只有me...

mysql主鍵索引 MySQL索引之主鍵索引

在mysql裡,主鍵索引和輔助索引分別是什麼意思,有什麼區別?上次的分享我們介紹了聚集索引和非聚集索引的區別,本次我們繼續介紹主鍵索引和輔助索引的區別。1 主鍵索引 主鍵索引,簡稱主鍵,原文是primary key,由乙個或多個列組成,用於唯一性標識資料表中的某一條記錄。乙個表可以沒有主鍵,但最多只...