21. B+樹在滿足聚簇索引和覆蓋索引的時(shí)候不需要回表查詢數(shù)據(jù)
在B+樹的索引中表窘,葉子節(jié)點(diǎn)可能存儲了當(dāng)前的key值集惋,也可能存儲了當(dāng)前的key值以及整行的數(shù)據(jù)怔软,這就是聚簇索引和非聚簇索引姜性。在InnoDB中猪叙,只有主鍵索引是聚簇索引赘风,如果沒有主鍵夹囚,則挑選一個(gè)唯一鍵建立聚簇索引。如果沒有唯一鍵邀窃,則隱式的生成一個(gè)鍵來建立聚簇索引崔兴。
當(dāng)查詢使用聚簇索引時(shí),在對應(yīng)的葉子節(jié)點(diǎn),可以獲取到整行數(shù)據(jù)敲茄,因此不用再次進(jìn)行回表查詢位谋。
22. 什么是聚簇索引?何時(shí)使用聚簇索引與非聚簇索引
(1)聚簇索引:將數(shù)據(jù)存儲與索引放到了一塊堰燎,找到索引也就找到了數(shù)據(jù)
(2)非聚簇索引:將數(shù)據(jù)存儲于索引分開結(jié)構(gòu)掏父,索引結(jié)構(gòu)的葉子節(jié)點(diǎn)指向了數(shù)據(jù)的對應(yīng)行,myisam通過key_buffer把索引先緩存到內(nèi)存中秆剪,當(dāng)需要訪問數(shù)據(jù)時(shí)(通過索引訪問數(shù)據(jù))赊淑,在內(nèi)存中直接搜索索引,然后通過索引找到磁盤相應(yīng)數(shù)據(jù)仅讽,這也就是為什么索引不在key buffer命中時(shí)陶缺,速度慢的原因
(3)澄清一個(gè)概念:innodb中,在聚簇索引之上創(chuàng)建的索引稱之為輔助索引洁灵,輔助索引訪問數(shù)據(jù)總是需要二次查找饱岸,非聚簇索引都是輔助索引,像復(fù)合索引徽千、前綴索引苫费、唯一索引,輔助索引葉子節(jié)點(diǎn)存儲的不再是行的物理位置双抽,而是主鍵值
何時(shí)使用聚簇索引與非聚簇索引
23. 非聚簇索引一定會回表查詢嗎百框?
不一定,這涉及到查詢語句所要求的字段是否全部命中了索引牍汹,如果全部命中了索引铐维,那么就不必再進(jìn)行回表查詢。
舉個(gè)簡單的例子慎菲,假設(shè)我們在員工表的年齡上建立了索引嫁蛇,那么當(dāng)進(jìn)行select age from employee where age < 20的查詢時(shí),在索引的葉子節(jié)點(diǎn)上钧嘶,已經(jīng)包含了age信息棠众,不會再次進(jìn)行回表查詢琳疏。
24. 聯(lián)合索引是什么有决?為什么需要注意聯(lián)合索引中的順序?
MySQL可以使用多個(gè)字段同時(shí)建立一個(gè)索引空盼,叫做聯(lián)合索引书幕。在聯(lián)合索引中,如果想要命中索引揽趾,需要按照建立索引時(shí)的字段順序挨個(gè)使用台汇,否則無法命中索引。
具體原因?yàn)?
(1)MySQL使用索引時(shí)需要索引有序,假設(shè)現(xiàn)在建立了"name苟呐,age痒芝,school"的聯(lián)合索引,那么索引的排序?yàn)? 先按照name排序牵素,如果name相同严衬,則按照age排序,如果age的值也相等笆呆,則按照school進(jìn)行排序请琳。
(2)當(dāng)進(jìn)行查詢時(shí),此時(shí)索引僅僅按照name嚴(yán)格有序赠幕,因此必須首先使用name字段進(jìn)行等值查詢俄精,之后對于匹配到的列而言,其按照age字段嚴(yán)格有序榕堰,此時(shí)可以使用age字段用做索引查找竖慧,以此類推。因此在建立聯(lián)合索引的時(shí)候應(yīng)該注意索引列的順序局冰,一般情況下测蘑,將查詢需求頻繁或者字段選擇性高的列放在前面。此外可以根據(jù)特例的查詢或者表結(jié)構(gòu)進(jìn)行單獨(dú)的調(diào)整康二。
最后碳胳,小編分類整理了許多java進(jìn)階學(xué)習(xí)材料和BAT面試給熱愛IT行業(yè)的你,如果需要資料的請轉(zhuǎn)發(fā)此文章后再私聊小編回復(fù)【java】就能領(lǐng)取2019年java進(jìn)階學(xué)習(xí)資料和BAT面試題以及《Effective Java》(第3版)電子版書籍沫勿。也可以加群:712263501領(lǐng)取海量學(xué)習(xí)資料進(jìn)行學(xué)習(xí)挨约。