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