問題前要:對於一個字段,它的更新操作很頻繁,那么應該使用普通索引還是唯一索引?
結論:
如果業務能夠保證唯一性應該盡量選擇普通索引而不是唯一索引
從查詢和更新兩方面說明:
查詢:
查詢來說二者的區別是
普通索引查到符合條件的項后會繼續查找下一項,如果下一項不符合再返回
唯一索引則是查到符合條件的項后就直接返回
其實這兩種方式效率幾乎沒有差別,因為查找都是先讀取數據項然后在內存中進行的所以多讀取一次並不會帶來很大的影響
更新:
對於更新操作二者還是有很大區別的,要理解他們之間的區別首先要理解change buffer
change buffer是用來記錄更新操作的一種行為,在沒有把數據項從硬盤讀取到內存中時,進行更新操作會先將操作記錄的change buffer中
在下一次進行select的時候在把數據項讀取到內存中時,會對數據項執行change buffer中的命令,這個過程也成為merge
所以唯一索引的更新操作往往是這樣,首先判斷要插入的項在數據庫中存不存在,這里就涉及到了一個讀的問題,往往這個時候就會把數據從硬盤讀取到內存中,如果這個時候還使用change buffer的意義並不大
因為change buffer存在的意義就是減少磁盤於內存的IO,現在數據項已經在內存中了,可以直接修改,所以唯一索引是不適用change buffer的
普通索引的更新操作
普通索引往往是將操作記錄到change buffer中,在下一次讀取的時候執行這些操作,可以顯著減少磁盤與內存的IO操作,從而提高效率
選擇:
如果是讀取遠大於更新和插入的表,唯一索引和普通索引都可以,但是如果業務需求相反,個人覺得應該使用普通索引,當然如果是那種更新完要求立即可見的需求,就是剛更新完就要再查詢的,這種情況下反而不推薦普通索引,因為這樣會頻繁的產生merge操作,起不到change buffer的作用,反而需要額外空間來維護change buffer就有點得不償失了
————————————————
版權聲明:本文為CSDN博主「煙火HL」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/sinat_22594643/article/details/87971916