MySQL的回表查詢與索引覆蓋查詢

2021-10-12 02:49:47 字數 1075 閱讀 8811

上篇講到,mysql中分為聚集索引和非聚集索引。非聚集索引的btree葉子節點中儲存的是當行資料的pk。所以為了取到具體資料,則需要通過pk回到聚集索引裡去查詢資料。著就叫回表查詢。掃瞄了2次索引樹。所以效率相對較低。

假設有個t表,如下圖所示。id是聚集索引,name則是普通索引。

idname

***1小毛男

2小高女3

大雄男4a夢

女表中有4條資料

id列的b+樹索引圖(聚集索引)

name列的b+樹索引圖(非聚集索引)

執行的查詢sql

select name, *** from t where name = 'a夢';
其執行過程是這樣的

粉紅色的路徑需要掃瞄兩遍索引樹,第一遍先通過非聚集索引定位到主鍵值id=4,然後第二遍再通過聚集索引定位到具體行記錄。這就是所謂的回表查詢,即先定位主鍵值,再根據主鍵值定位行記錄,效能相對於只掃瞄一遍聚集索引樹的效能要低一些。

索引覆蓋就是為了避免回表查詢的一種解決方案。見名知意,就是查詢的所有列均被所使用的索引的列給到覆蓋(可以是單列索引也可以是聯合索引)。因為索引中已經包含了要查詢的字段的值,因此查詢的時候直接返回索引中的字段值就可以了,不需要再到表中查詢,避免了對主鍵索引的二次查詢,也就提高了查詢的效率。

還是以上面那張表與sql為例子,id是聚集索引,name是非聚集索引。

如果我們想要避免回表查詢有兩種方案。

-不是所有型別的索引都可以成為覆蓋索引的。因為覆蓋索引必須要儲存索引的列值,而雜湊索引、空間索引和全文索引等都不儲存索引列值,索引mysql只能使用b-tree索引做覆蓋索引。

mysql中的回表查詢與索引覆蓋

了解一下mysql中的回表查詢與索引覆蓋。回表查詢 要說回表查詢,先要從innodb的索引實現說起。innodb有兩大類索引,一類是聚集索引 clustered index 一類是普通索引 secondary index innodb的聚集索引 innodb聚集索引的葉子節點儲存行記錄,因此inno...

mysql覆蓋索引與回表

要說回表查詢,先要從innodb的索引實現說起。innodb有兩大類索引,一類是聚集索引 clustered index 一類是普通索引 secondary index innodb的聚集索引 innodb聚集索引的葉子節點儲存行記錄,因此innodb必須要有且只有乙個聚集索引。1.如果表定義了pk...

MySQL 的覆蓋索引與回表

如果表設定了主鍵,則主鍵就是聚簇索引 如果表沒有主鍵,則會預設第乙個not null,且唯一 unique 的列作為聚簇索引 以上都沒有,則會預設建立乙個隱藏的row id作為聚簇索引 innodb的聚簇索引的葉子節點儲存的是行記錄 其實是頁結構,乙個頁包含多行資料 innodb必須要有至少乙個聚簇...