首頁技術(shù)文章正文

弄清索引的障礙(篇章一)

更新時(shí)間:2018-08-09 來源:黑馬程序員 瀏覽量:

弄清索引的障礙(一)

任何事物都有它的兩面性,索引也不例外,索引的好處很多,但這里咱們聊聊索引的壞處。

索引的缺點(diǎn)是很明顯的,因?yàn)樗饕旧硎怯行虻模聰?shù)據(jù)的過程中也要更新索引,更新完后還要保持索引的有序性,這就需要付出很大的開銷了,索引不好的一面就從這里開始顯示出來了。

我們先簡(jiǎn)要綜述一下索引的不足之處有哪些,接下來詳細(xì)闡述,隨后一起和大家探索各種工作中的案例,最后為思考回顧。


  索引的不足之處

關(guān)于索引的不足之處我們可以從索引的開銷和容易失敗這兩方面來討論:

1.1索引的各種開銷

1.1.1熱塊競(jìng)爭(zhēng)

索引最新的數(shù)據(jù)塊一般是在最右邊,而我們?cè)L問數(shù)據(jù)時(shí)正常來說也是訪問比較新的數(shù)據(jù),歷史數(shù)據(jù)很少有人關(guān)注,然后問題就來了,大家都一起訪問最新的數(shù)據(jù),不是都集中于同一個(gè)目標(biāo)來訪問了嗎?這就很容易產(chǎn)生熱塊競(jìng)爭(zhēng)。

1.1.2回表開銷

另外大家都知道索引存儲(chǔ)索引列的值和rowid,通過rowid來定位回到表中,其實(shí)這個(gè)回到表中的開銷也是很大,具體情況我們隨后可以了解到。

1.1.3更新開銷

索引的有序性是一個(gè)非常重要的特性,這個(gè)特性能夠消除排序等開銷,但是索引塊要保持有序性,可不是一件容易的事,畢竟索引列的數(shù)據(jù)是隨機(jī)插入的,比如你在原來的索引列中存儲(chǔ)的是100,110,111,等等時(shí),現(xiàn)在要插入101,就應(yīng)該在100和111之間插入,為了保證這個(gè)順序索引需要做很多事,比如索引塊分裂。而索引列的增刪改的開銷是很大的。

1.1.4建立開銷

還有千萬別忽略了建立索引的開銷,這也和索引的有序性有關(guān)。我們?cè)诮⑺饕倪^程中,首先把索引列的數(shù)據(jù)排序提取出來,再插入到塊中形成索引塊,這時(shí)如果數(shù)據(jù)不斷地插入,排序提取這個(gè)動(dòng)作什么時(shí)候能結(jié)束呢?所以還必須要鎖表,這就是一個(gè)很大的開銷(online建索引是一個(gè)特殊的思路,這里不做描述)。當(dāng)然建索引過程中排序這個(gè)動(dòng)作本身也是不小的開銷。


1.2索引使用失效

索引的不足之處除了上述的幾點(diǎn)外,從另一個(gè)維度看,還會(huì)有失效的可能。我們現(xiàn)在知道建索引對(duì)查詢一般比較有利,對(duì)更新一般比較有害。不過有的時(shí)候,雖然建了索引,但其對(duì)查詢毫無幫助,這種情況還是有的。比如索引失效了,這分為邏輯失效和物理失效兩種。

1.2.1邏輯失效

邏輯失效是索引本身并沒有真正失效,只是由于寫法的問題導(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ù)庫被迫不用索引,等等。

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/

分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!