基本概念
????數(shù)據(jù)庫的索引類似書的目錄,我們通過標(biāo)題及其對應(yīng)的頁碼便可快速的找到標(biāo)題對應(yīng)的內(nèi)容。在數(shù)據(jù)庫中,可以根據(jù)索引快速定位記錄的位置,然后從磁盤讀出數(shù)據(jù)。因此,簡單來說,索引就是幫助我們快速定位記錄位置的數(shù)據(jù)結(jié)構(gòu),可以極大地提高查詢性能。
聚簇索引和非聚餐索引
????在介紹索引的工作原理之前先給大家介紹下聚簇索引和非聚簇索引的概念。
- 聚簇索引
《數(shù)據(jù)庫系統(tǒng)概念》中的定義:如果包含記錄的文件按照某個搜索碼指定的順序排序,那么該搜索碼對應(yīng)的索引稱為聚簇索引(clustering index),聚簇索引也稱為主索引(primary index)。通俗來說就是對于數(shù)據(jù)庫中的表R,如果表中的記錄按照某列屬性p順序存儲在磁盤文件上,則屬性p對應(yīng)的索引稱為聚簇索引。 - 非聚簇索引
《數(shù)據(jù)庫系統(tǒng)概念》中的定義:搜索碼指定的順序與文件中記錄的物理順序不同的索引稱為非聚簇索引或輔助索引。
????在innodb引擎中,數(shù)據(jù)是按照主鍵的順序來存儲的,因此主鍵對應(yīng)的索引為聚簇索引;由于一張表只有一個索引,所以一張表有且只有一個聚簇索引。除主鍵外,其他屬性都可建立非聚簇索引,所以一張表可以有多個非聚簇索引。介紹完聚簇索引和非聚簇索引,下面我們具體剖析下innnodb索引的工作原理。
innodb索引工作原理
????在innodb中,索引的數(shù)據(jù)結(jié)構(gòu)是B+樹,InnoDB 的 B+樹索引分為主索引(聚簇索引)和輔助索引(非聚簇索引)。主索引的葉子節(jié)點(diǎn) data 域記錄著完整的數(shù)據(jù)記錄。輔助索引的葉子節(jié)點(diǎn)的 data 域記錄著主鍵的值,因此在使用輔助索引進(jìn)行查找時,需要先查找到主鍵值,然后再到主索引中進(jìn)行查找。為了更加形象的描述索引的工作方式,這里通過一個例子來進(jìn)行說明。如下是一張課程表cource(id, name, score):
| id | name | score |
|---|---|---|
| 101 | 數(shù)據(jù)庫系統(tǒng)原理 | 5 |
| 102 | 操作系統(tǒng) | 5 |
| 111 | 數(shù)據(jù)結(jié)構(gòu) | 5 |
| 112 | 算法導(dǎo)論 | 5 |
????上表中,主鍵為id,我們畫出該表的主索引結(jié)構(gòu),如下:

????如上圖所示,B+樹的非葉節(jié)點(diǎn)只充當(dāng)索引不存數(shù)據(jù),葉子節(jié)點(diǎn)存儲表記錄且通過指針串聯(lián)起來,方便范圍查詢。當(dāng)執(zhí)行sql語句'select * from course where id=111'時,索引執(zhí)行過程如下:

????從上圖可以看出,從根節(jié)點(diǎn)開始,經(jīng)過兩次查找便找到id=111的記錄所在位置,假如索引完全從磁盤讀取,那么經(jīng)過兩次磁盤io便可讀出數(shù)據(jù),如果不使用索引,則需在磁盤上遍歷整個表記錄,平均io次數(shù)為n/2(n為表記錄數(shù))。顯而易見,使用索引可以極大加快查詢的速度。
????以上是通過主索引的方式查找記錄,但是在實(shí)際使用中,往往有通過其他字段查詢的需求,如通過查詢課程名找到相關(guān)記錄,由于課程名不是主鍵,不能利用主索引加速查詢,因此為了加快查詢速度,可以對課程名創(chuàng)建輔助索引。輔助索引結(jié)構(gòu)如下:

????從上圖可以看出,輔助索引依然是一棵B+樹,和主索引不同的是,輔助索引的葉子結(jié)點(diǎn)的值不是一條記錄的完整數(shù)據(jù),而是存的記錄對應(yīng)的主鍵值,因此,要查找某條記錄的完整值還需要到主索引上去查詢。如sql語句'select * from course where name="數(shù)據(jù)結(jié)構(gòu)"'的執(zhí)行過程:首先通過圖3中輔助索引找到'數(shù)據(jù)結(jié)構(gòu)'對應(yīng)的主鍵'111',然后拿著主鍵到圖一中的主索引查找完整數(shù)據(jù)。
????以上便是輔助索引的執(zhí)行過程??梢钥闯雒刻砑右粋€輔助索引就會增加一棵B+樹,索引帶來的好處是提高查詢性能,但是對于寫入,每插入一條記錄需要維護(hù)所有B+樹,影響寫入性能,因此,索引不能隨意添加,應(yīng)該按需創(chuàng)建。
總結(jié)
????本文介紹了數(shù)據(jù)庫中聚餐索引及非聚簇索引的概念,同時引出了innodb索引的工作原理并舉例介紹了innodb索引的執(zhí)行過程。幫助開發(fā)人員了解innodb引擎索引的內(nèi)在原理,在開發(fā)實(shí)踐中充分且合理的利用索引,提高程序性能。