mysql索引 之覆蓋索引

2021-08-14 23:40:20 字數 1419 閱讀 7034

今天參考了《高效能mysql》與幾篇博文,總結一下我個人的對覆蓋索引的理解。

首先,覆蓋索引並不是一種新的資料結構,它的意思是在查詢的時候,利用到的索引已經完全包含需要查詢欄位的情況,在這種情況下,查詢結果直接就是索引的值,並不需要再利用索引回表查詢了。

繼續拿sakila資料庫(mysql安裝好後自帶的乙個demo資料庫)來舉例,比如

explain select actor_id from actor where actor_id = 1;
看執行結果:

這裡最主要看extra,它的值為using index,它在這句查詢中含義就是直接訪問actor_id這個索引就足已獲取到所需要的資料,不需要再通過索引回表查詢了。

因為我們使用actor_id(它在actor表裡是主鍵)索引來查字段actor_id,索引的值就是actor_id的值,所以可以說:actor_id在當前查詢充當著覆蓋索引這個角色。

覆蓋索引的好處:

1.索引一般都會遠比它所指向的資料行小,如果只需讀取索引,那mysql就能夠大大的減少資料訪問量。這對快取的負載也非常重要,因為這種情況下響應時間大部分花費在資料的拷貝上。此外對於i/o密集型(可簡單理解為在input和output上花費了大多時間

的應用)也有幫助,因為索引比資料更小,可以更快的傳入記憶體中。

2.索引是按照列值來儲存的(這裡指的是b-tree索引,並且在單個頁內),所以對於i/o密集型的範圍查詢會比隨機從磁碟讀取每一行資料的i/o要少得多。

3.一些儲存引擎如myisam在記憶體中只快取索引,資料則依賴於作業系統來快取,因此要訪問資料需要一次系統呼叫,這可能會影響效能。

4.由於儲存引擎innodb有聚簇索引(也叫聚集索引),覆蓋索引對innodb特別有用。innodb的二級索引(也成輔助索引)在葉子結點中儲存了行的主鍵值,所以如果二級索引能夠覆蓋查詢,則可以避免對主鍵索引的二次查詢。

對於第4條好處,我們可以在舉例子來理清一下,還是actor表:

explain select actor_id, last_name from actor where last_name = 'hopper';
執行結果:

可以看到,我們這次查詢了actor_id和last_name兩個字段,但條件只用了last_name這個二級索引,extra的值卻也是為using index。原因是二級索引的葉子結點中會有主鍵索引(actor_id)值,所以可以理解為這次查詢是利用actor_id和last_name這兩個索引來查詢actor_id和last_name這兩個字段,因此它們在這個查詢中充當了覆蓋索引。

關於覆蓋索引就講這麼多了,可能讀我這篇文章的人依舊會一臉的懵,在我看來,這主要是因為對資料結構以及一些硬體方面的不熟悉造成的。這裡來分享大牛的一篇文章,在看懂索引之前我也是一臉懵啊,相信看完這篇文章再回來就會比較易懂了吧:mysql索引背後的資料結構及演算法原理

MySQL 索引 覆蓋索引

1.什麼是覆蓋索引?概念 查詢語句中所需要的列在索引中,這樣查詢結果在索引的資料結構中查詢即可拿到結果。附加解釋 2.形成覆蓋索引的條件索引分為多種型別,從資料結構上分為 二叉樹 紅黑樹 hash索引 b tree索引,b tree mysql使用的儲存結構 索引的實現可以使用多種資料結構,這裡使用...

MySQL覆蓋索引呼叫 MySQL 覆蓋索引

什麼是覆蓋索引 建立乙個索引,該索引包含查詢中用到的所有字段,稱為 覆蓋索引 使用覆蓋索引,mysql 只需要通過索引就可以查詢和返回查詢所需要的資料,而不必在使用索引處理資料之後再進行回表操作。覆蓋索引可以一次性完成查詢工作,有效減少io,提高查詢效率。使用示例 查詢語句 select col2,...

mysql覆蓋索引 MySQL 的覆蓋索引與回表

兩大類索引 使用的儲存引擎 mysql5.7 innodb 聚簇索引 如果表設定了主鍵,則主鍵就是聚簇索引 如果表沒有主鍵,則會預設第乙個not null,且唯一 unique 的列作為聚簇索引 以上都沒有,則會預設建立乙個隱藏的row id作為聚簇索引 innodb的聚簇索引的葉子節點儲存的是行記...