聚簇索引:索引的葉節(jié)點(diǎn)就是數(shù)據(jù)節(jié)點(diǎn)涉波。innodb
非聚簇索引:非聚簇索引的葉節(jié)點(diǎn)仍然是索引節(jié)點(diǎn),只不過(guò)有一個(gè)指針指向?qū)?yīng)的數(shù)據(jù)塊鸵膏。MyISAM
兩個(gè)都B+樹 葉子節(jié)點(diǎn)是 鏈表
聚簇索引需要注意的地方
當(dāng)使用主鍵為聚簇索引時(shí)馏颂,主鍵最好不要使用uuid,因?yàn)閡uid的值太過(guò)離散氧卧,不適合排序且可能出線新增加記錄的uuid,會(huì)插入在索引樹中間的位置氏堤,導(dǎo)致索引樹調(diào)整復(fù)雜度變大沙绝,消耗更多的時(shí)間和資源搏明。
建議使用int類型的自增,方便排序并且默認(rèn)會(huì)在索引樹的末尾增加主鍵值闪檬,對(duì)索引樹的結(jié)構(gòu)影響最小星著。而且,主鍵值占用的存儲(chǔ)空間越大粗悯,輔助索引中保存的主鍵值也會(huì)跟著變大虚循,占用存儲(chǔ)空間,也會(huì)影響到IO操作讀取到的數(shù)據(jù)量样傍。
為什么主鍵通常建議使用自增id
聚簇索引的數(shù)據(jù)的物理存放順序與索引順序是一致的横缔,即:只要索引是相鄰的,那么對(duì)應(yīng)的數(shù)據(jù)一定也是相鄰地存放在磁盤上的衫哥。如果主鍵不是自增id茎刚,那么可以想 象,它會(huì)干些什么撤逢,不斷地調(diào)整數(shù)據(jù)的物理地址膛锭、分頁(yè),當(dāng)然也有其他一些措施來(lái)減少這些操作笛质,但卻無(wú)法徹底避免泉沾。但捞蚂,如果是自增的妇押,那就簡(jiǎn)單了,它只需要一 頁(yè)一頁(yè)地寫姓迅,索引結(jié)構(gòu)相對(duì)緊湊敲霍,磁盤碎片少,效率也高丁存。
唯一索引和普通索引的區(qū)別:
普通索引在更新的時(shí)候會(huì)先去緩存中找數(shù)據(jù)沒找到的話會(huì)先記錄這次操作肩杈,等下一次取數(shù)據(jù)的時(shí)候進(jìn)行數(shù)據(jù)merge減少了io次數(shù)
而唯一索引由于需要多對(duì)比一次沖突 這時(shí)候用change buffer 沒什么意義 反而增大了維護(hù)changebuffer的開銷。
所以一般修改刪除比較多的時(shí)候都是用普通索引解寝,如果更新完馬上就要用的需求比較多的話就要考慮用唯一索引了扩然。
覆蓋索引:
覆蓋索引:一個(gè)索引中包含所有需要查詢字段的值
優(yōu)點(diǎn):無(wú)需回表
1.索引條目通常遠(yuǎn)小于數(shù)據(jù)行大小,只需要讀取索引聋伦,則mysql會(huì)極大地減少數(shù)據(jù)訪問(wèn)量夫偶。
2.因?yàn)樗饕前凑樟兄淀樞虼鎯?chǔ)的,所以對(duì)于IO密集的范圍查找會(huì)比隨機(jī)從磁盤讀取每一行數(shù)據(jù)的IO少很多觉增。
3.一些存儲(chǔ)引擎如myisam在內(nèi)存中只緩存索引兵拢,數(shù)據(jù)則依賴于操作系統(tǒng)來(lái)緩存,因此要訪問(wèn)數(shù)據(jù)需要一次系統(tǒng)調(diào)用
4.innodb的聚簇索引逾礁,覆蓋索引對(duì)innodb表特別有用