MySQL 資料庫索引原理與分類

2021-08-29 21:03:01 字數 3221 閱讀 3933

資料庫索引本質上是一種資料結構(儲存結構+演算法),目的是為了加快目標資料檢索的速度。

1.索引的本質與原理?

2.索引的分類?

3.福利彩蛋

我們先看乙個問題:

假設現在有100000條從0到10000且從大到小排列的整型資料,1條資料的大小假設(真的只是假設)是1kb,作業系統的每次i/o資料塊(頁)大小是8kb。

如果現在我要查詢其中 50001 這個資料值,有如下幾個方式:

1.最蠢的方式,遍歷,每次遍歷到乙個值,就用這個值跟目標值做對比,如果不等於那麼查詢下乙個。這樣的話那麼每次i/o是8條資料,目標資料在50001/8 約6600多次i/o 才能找到目標資料。

2.二分查詢,最好一次性將100000條資料全部讀到記憶體,這樣查詢也是很快的。

但是即使二分查詢很快,但這些資料也不能單單通過一次i/o全部進入記憶體,進行運算。

那麼怎樣在i/o 塊大小 的限制下快速利用二分查詢找到目標值呢?我們得引入新的資料結構,b+樹正好可以解決上述i/o塊大小的限制,解決限制不是說增大了限制範圍,而是我們在此限制上改變了資料的儲存結構,即在同等限制條件下,快速檢索到目標資料,如下是b+樹的原理講解:

注意,我們主要講解索引的原理,沒有必要過於糾結b+樹的各種操作,及**實現

1.1 b+ 樹

b+樹圖示

根據上圖所示,及其**定義:

1.圖上藍色的塊為關鍵字,我們發現所有的關鍵字最終都會被包含在葉子節點當中。

圖上的黃色區塊表示的是子樹的指標域,比如根節點下的p2指向的就是28-65之間的索引。

2.所有的葉子結點中包含了全部關鍵字的資訊,及指向含有這些關鍵字記錄的指標,且葉子結點本身依關鍵字的大小自小而大

的順序鏈結。 (而b 樹的葉子節點並沒有包括全部需要查詢的資訊)

3.所有的非終端結點可以看成是索引部分,結點中僅含有其子樹根結點中最大

(或最小)關鍵字。 (而b 樹的非終節點也包含需要查詢的有效資訊)

現在我們來看下查詢資料 60 的 查詢過程,如下所示:

1.i/o第一次:讀入5、28、65 資料塊,在此同級別節點塊上,60在28到65之間(其實是二分查詢),那走p2指標指向的子樹。

2.i/o第二次:讀入28、35、56 資料塊,在此同級別節點塊上,60大於56,所以走p3指標指向的子樹(上圖中就是葉子節點)。

3.i/o第三次:讀入葉子節點,在這個葉子節點中,使用二分查詢演算法找到目標值60。

由上述查詢過程所示統共需要三次i/o就能查到目標值,效能大大提公升。

2.1 聚簇索引 & 非聚簇索引

innodb 主鍵使用的是聚簇索引,myisam 不管是主鍵索引,還是二級索引使用的都是非聚簇索引。

下圖形象說明了聚簇索引表(innodb)和非聚簇索引(myisam)的區別:

聚簇索引與非聚簇索引

1.對於非聚簇索引表來說(右圖),表資料和索引是分成兩部分儲存的,主鍵索引和二級索引儲存上沒有任何區別。使用的是b+樹作為索引的儲存結構,所有的節點都是索引,葉子節點儲存的是索引+索引對應的記錄的位址。

2.對於聚簇索引表來說(左圖),表資料是和主鍵一起儲存的,主鍵索引的葉結點儲存行資料(包含了主鍵值),二級索引的葉結點儲存行的主鍵值。使用的是b+樹作為索引的儲存結構,非葉子節點都是索引關鍵字,但非葉子節點中的關鍵字中不儲存對應記錄的具體內容或內容位址。葉子節點上的資料是主鍵與具體記錄(資料內容)。

聚簇索引的優點

1.當你需要取出一定範圍內的資料時

,用聚簇索引也比用非聚簇索引好。

2.當通過聚簇索引查詢目標資料時理論上比非聚簇索引要快,因為非聚簇索引定位到對應主鍵時還要多一次目標記錄定址,即多一次i/o。

聚簇索引的缺點

1.插入速度嚴重依賴於插入順序,按照主鍵的順序插入是最快的方式,否則將會出現頁**,嚴重影響效能。因此,對於innodb表,我們一般都會定義乙個自增的id列為主鍵。

2.更新主鍵的代價很高,因為將會導致被更新的行移動。因此,對於innodb表,我們一般定義主鍵為不可更新。

3.二級索引訪問需要兩次索引查詢,第一次找到主鍵值,第二次根據主鍵值找到行資料。

二級索引的葉節點儲存的是主鍵值,而不是行指標(非聚簇索引儲存的是指標或者說是位址),這是為了減少當出現行移動或資料頁**時二級索引的維護工作,但會讓二級索引占用更多的空間。

4.採用聚簇索引插入新值比採用非聚簇索引插入新值的速度要慢很多,因為插入要保證主鍵不能重複,判斷主鍵不能重複,採用的方式在不同的索引下面會有很大的效能差距,聚簇索引遍歷所有的葉子節點,非聚簇索引也判斷所有的葉子節點,但是聚簇索引的葉子節點除了帶有主鍵還有記錄值,記錄的大小往往比主鍵要大的多。這樣就會導致聚簇索引在判定新記錄攜帶的主鍵是否重複時進行昂貴的i/o代價。

唯一索引

主鍵就是唯一索引,但是唯一索引不一定是主鍵,唯一索引可以為空,但是空值只能有乙個,主鍵不能為空。

普通唯一索引:單個欄位上建立唯一索引,需要此欄位所在的列上不能有重複的值,屬於二級索引。

復合唯一索引:多個欄位上聯合建立唯一索引,屬於二級索引。

覆蓋索引

查詢的目標資料, 包含在索引中,如建立idx_colum1_colum2.

select colum1 from table where colum1 = ? and colum2 > ?
通過查詢索引就能確定最終的資料,不用再利用葉子節點中儲存的主鍵值去查詢對應的資料。

覆蓋索引的效能是極高的。

3.福利彩蛋

部落格搬家:大坤的個人部落格

Mysql資料庫索引原理 InnoDB索引實現

innodb使用b tree作為索引結構 例如有這麼乙個表資料 col1為主鍵 在innodb中,表資料檔案本身就是按b tree組織的乙個索引結構,這棵樹的葉結點data域儲存了完整的資料記錄。這個索引的key是資料表的主鍵,因此innodb表資料檔案本身就是主索引。圖1圖1是innodb資料檔案...

資料庫索引分類

資料庫索引 作用 提高查詢速度 確保資料的唯一性 可以加速表和表之間的連線,實現表和表之間的參照完整性 使用分組和排序子句進行資料檢索時,可以減少分組和排序的時間 全文檢索字段進行搜素優化 分類 主鍵索引 primay key 唯一索引 unique 常規索引 index 全文索引 fulltext...

MySQL資料庫索引原理總結

mysql資料庫中索引 在mysql索引使用中,常常出現索引效能需要考慮的問題,那我們是否應當對索引原理進行深入思考。mysql中不同的儲存引擎使用的索引原理是不同的,下面介紹三種型別的索引型別b tree b tree hash。什麼是btree btree是一種高效的資料庫儲存結構,具體結構形式...