覆蓋索引就是需要查詢的列正好也在索引葉子節(jié)點(diǎn)上,可以避免回表的操作已慢,極大的提高了查詢性能座掘,當(dāng)數(shù)據(jù)量比較大時(shí)递惋,查詢效率是很明顯的。
當(dāng)我們SELECT *時(shí)溢陪,會(huì)把所有列查詢出來萍虽,但是實(shí)際運(yùn)用中我們可能只需要用到個(gè)別的幾個(gè)列,這樣會(huì)特別的浪費(fèi)資源形真,在這種情況下杉编,我們就可以使用到覆蓋索引解決這樣的問題,因?yàn)楦采w索引中的葉子節(jié)點(diǎn)包含你所需要查詢的列可以直接返回從而不需要回表操作咆霜,下面我們用具體的實(shí)例看看吧~邓馒。
我們創(chuàng)建一張用戶表:
目前我們?cè)跊]有創(chuàng)建任何索引的情況下用age字段查詢一下。
EXPLAIN SELECT age FROM user_test WHERE age = 12;
在沒有索引的情況下蛾坯,該查詢是自動(dòng)掃描全表光酣,把條件為age=12的篩選出來,非常消耗I/O資源脉课,下面我們給age字段添加索引做一下優(yōu)化救军。
ALTER TABLE `user_test` add index age(age);
在為age添加索引后我們?cè)俅芜M(jìn)行查詢改览。
此時(shí)SQL語句用到了age的索引,并且通過Extra=using index可以看出還用到了覆蓋索引缤言,因?yàn)楫?dāng)我們給age創(chuàng)建普通索引的時(shí)候形成了一顆以age字段排序的B+tree宝当,葉子節(jié)點(diǎn)保存了age的值,所以當(dāng)查詢列包含了索引的值就可以用了覆蓋索引胆萧,不需要進(jìn)行回表操作庆揩。下面我們換成查詢所有列就會(huì)發(fā)現(xiàn)此時(shí)用不到覆蓋索引了,必須要回到聚簇索引中查找對(duì)應(yīng)的行跌穗,也就是我們通常說的回表订晌。
type=ref并且Extra=NULL說明沒有任何額外的執(zhí)行信息,說明該條查詢沒有使用到覆蓋索引蚌吸,從而進(jìn)行了回表操作锈拨。