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

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

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

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

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

回答
編輯回答
淺時光

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

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

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

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

2017年8月26日 05:08