鍍金池/ 問答/數(shù)據(jù)庫/ mysql的innodb,通過聚集索引查詢是否不管怎么樣都是索引覆蓋?

mysql的innodb,通過聚集索引查詢是否不管怎么樣都是索引覆蓋?

我用的是innodb,表上只有一個(gè)主鍵且是聚集索引(默認(rèn)是聚集索引了),我的查詢語句,where條件是這個(gè)主鍵,但是查詢列是任意的,發(fā)現(xiàn)執(zhí)行計(jì)劃的extra并不是using index,按理來說,聚集索引的葉子節(jié)點(diǎn)的data域存放的是整行的數(shù)據(jù),那不管我查詢列是什么,只要where條件是主鍵,都可以從聚集索引中拿到吧。

但是結(jié)果就是只有當(dāng)查詢列是主鍵的時(shí)候,才會(huì)using index,不然extra就是空

再多問一句,innodb支持聯(lián)合聚集索引嗎?

回答
編輯回答
淺時(shí)光

innodb的主鍵葉子節(jié)點(diǎn)是存儲了整行的數(shù)據(jù),但是要注意覆蓋索引的概念,所謂覆蓋索引只是認(rèn)為賦予的一個(gè)概念,索引列覆蓋了你select的字段才叫覆蓋,而對于innodb的主鍵來說,雖然存儲了整行數(shù)據(jù),但是主鍵不是由所有列組成的,你的例子就是一個(gè)id列是主鍵而已,覆蓋索引就是很簡單的,你select的字段和where篩選的字段在索引列范圍內(nèi),或者干脆你都沒有where條件,只select了索引列中的幾個(gè)列,那才是覆蓋索引

2017年9月17日 13:01
編輯回答
哚蕾咪

如果索引包含所有滿足查詢需要的數(shù)據(jù)的索引則成為覆蓋索引,也就是平時(shí)所說的不需要回表操作,即索引的葉子節(jié)點(diǎn)上面包含了他們查找的數(shù)據(jù)(hash索引不可以)。你的任意列有的不在索引節(jié)點(diǎn)上,就不會(huì)成為覆蓋索引。

判斷標(biāo)準(zhǔn):使用explain,可以通過輸出的extra列來判斷,對于一個(gè)索引覆蓋查詢,顯示為using index,MySQL查詢優(yōu)化器在執(zhí)行查詢前會(huì)決定是否有索引覆蓋查詢。

2017年8月26日 05:08