更新時(shí)間:2018-08-09 來(lái)源:黑馬程序員 瀏覽量:
任何事物都有它的兩面性,索引也不例外,索引的好處很多,但這里咱們聊聊索引的壞處。
索引的缺點(diǎn)是很明顯的,因?yàn)樗饕旧硎怯行虻?,而跟新?shù)據(jù)的過(guò)程中也要更新索引,更新完后還要保持索引的有序性,這就需要付出很大的開(kāi)銷了,索引不好的一面就從這里開(kāi)始顯示出來(lái)了。
我們先簡(jiǎn)要綜述一下索引的不足之處有哪些,接下來(lái)詳細(xì)闡述,隨后一起和大家探索各種工作中的案例,最后為思考回顧。
索引的不足之處
關(guān)于索引的不足之處我們可以從索引的開(kāi)銷和容易失敗這兩方面來(lái)討論:
1.1索引的各種開(kāi)銷
1.1.1熱塊競(jìng)爭(zhēng)
索引最新的數(shù)據(jù)塊一般是在最右邊,而我們?cè)L問(wèn)數(shù)據(jù)時(shí)正常來(lái)說(shuō)也是訪問(wèn)比較新的數(shù)據(jù),歷史數(shù)據(jù)很少有人關(guān)注,然后問(wèn)題就來(lái)了,大家都一起訪問(wèn)最新的數(shù)據(jù),不是都集中于同一個(gè)目標(biāo)來(lái)訪問(wèn)了嗎?這就很容易產(chǎn)生熱塊競(jìng)爭(zhēng)。
1.1.2回表開(kāi)銷
另外大家都知道索引存儲(chǔ)索引列的值和rowid,通過(guò)rowid來(lái)定位回到表中,其實(shí)這個(gè)回到表中的開(kāi)銷也是很大,具體情況我們隨后可以了解到。
1.1.3更新開(kāi)銷
索引的有序性是一個(gè)非常重要的特性,這個(gè)特性能夠消除排序等開(kāi)銷,但是索引塊要保持有序性,可不是一件容易的事,畢竟索引列的數(shù)據(jù)是隨機(jī)插入的,比如你在原來(lái)的索引列中存儲(chǔ)的是100,110,111,等等時(shí),現(xiàn)在要插入101,就應(yīng)該在100和111之間插入,為了保證這個(gè)順序索引需要做很多事,比如索引塊分裂。而索引列的增刪改的開(kāi)銷是很大的。
1.1.4建立開(kāi)銷
還有千萬(wàn)別忽略了建立索引的開(kāi)銷,這也和索引的有序性有關(guān)。我們?cè)诮⑺饕倪^(guò)程中,首先把索引列的數(shù)據(jù)排序提取出來(lái),再插入到塊中形成索引塊,這時(shí)如果數(shù)據(jù)不斷地插入,排序提取這個(gè)動(dòng)作什么時(shí)候能結(jié)束呢?所以還必須要鎖表,這就是一個(gè)很大的開(kāi)銷(online建索引是一個(gè)特殊的思路,這里不做描述)。當(dāng)然建索引過(guò)程中排序這個(gè)動(dòng)作本身也是不小的開(kāi)銷。
1.2索引使用失效
索引的不足之處除了上述的幾點(diǎn)外,從另一個(gè)維度看,還會(huì)有失效的可能。我們現(xiàn)在知道建索引對(duì)查詢一般比較有利,對(duì)更新一般比較有害。不過(guò)有的時(shí)候,雖然建了索引,但其對(duì)查詢毫無(wú)幫助,這種情況還是有的。比如索引失效了,這分為邏輯失效和物理失效兩種。
1.2.1邏輯失效
邏輯失效是索引本身并沒(méi)有真正失效,只是由于寫(xiě)法的問(wèn)題導(dǎo)致索引用不上,比如對(duì)SQL的條件列進(jìn)行運(yùn)算,類似select * from t where upper(name)=’ABC’等,這時(shí)在name列上建了Btree索引是用不上的,再或者比如被人強(qiáng)制用了全表掃描的Hint等導(dǎo)致數(shù)據(jù)庫(kù)被迫不用索引,等等。
1.2.2物理失效
物理失效就是索引真的失效了,比如被人誤設(shè)了unusable動(dòng)作,或者是一些類似分區(qū)表的不規(guī)范操作導(dǎo)致的索引失效。
總結(jié):上述簡(jiǎn)要地介紹了索引的一些不足之處,后面的篇章再詳細(xì)討論一番.....后期待續(xù)
作者:黑馬程序員javaEE培訓(xùn)學(xué)院
首發(fā):http://java.itheima.cn/