簡介
覆蓋索引是InnoDB中索引的特例,索引中包含查詢的所有必填字段;換句話說,索引本身包含執(zhí)行查詢所需的數(shù)據(jù),而不必執(zhí)行額外的讀取。
請注意,在InnoDB中,數(shù)據(jù)是使用主鍵索引存儲的。換句話說,數(shù)據(jù)通過主鍵索引物理地存儲為B +樹。因此,主鍵被包括在所有二級索引的葉節(jié)點中以便建立從二級索引到實際數(shù)據(jù)行的引用。
因此,任何涉及二級索引的查找都必須從根節(jié)點通過分支節(jié)點導(dǎo)航到正確的葉節(jié)點以獲取主鍵值,然后對主鍵索引執(zhí)行隨機IO讀取(再次從根節(jié)點通過分支節(jié)點到正確的葉節(jié)點)來獲取數(shù)據(jù)行。
使用覆蓋索引,我們避免了在主鍵索引(一個B +樹較少遍歷,避免昂貴的IO操作)上的這種額外的隨機IO讀取以獲取數(shù)據(jù)行,因為查詢所需的所有字段都包括在覆蓋索引中。
什么時候使用覆蓋索引
避免大表額外的IO讀取。有時甚至可以避免額外的物理隨機IO讀?。ㄗ畎嘿F的IO操作)。
我們可以使用這個特定的索引進行查詢,需要:
過濾符合一定條件的行(WHERE子句)
分組數(shù)據(jù)(GROUP BY子句)
按覆蓋索引(ORDER BY子句)的順序排序數(shù)據(jù)
投影數(shù)據(jù)(SELECT子句)
實例測試
創(chuàng)建測試表
CREATE TABLE big_table(
? id int primary key auto_increment,
? field01 int,
? field02 int,
? field03 varchar(50)
) engine=innodb;
文章來源:https://m.aliyun.com/yunqi/articles/412937