考慮下面一種情況:
select name from CUser where id_card = 'xxxxxxxyyyyyyzzzzz';
你可能會將id_card作為主鍵了,但最好別這么做。你想想這么長一串的字符串做主鍵,查詢時候效率其實是比較低的,其實是建議選擇其他的作為主鍵。
那么我們很可能查的時候還是要按照身份證查的啊!所以在身份證上做個索引是應該的。那么用唯一索引還是普通索引?其實這里業務邏輯已經保證了身份證號唯一,所以唯一索引和普通索引在邏輯上都是對的。
那么到底挑哪個呢?其實這種時候我們建議是用普通索引,原因如下:
查詢
假設,執行查詢的語句是 select id from T where k=5
其實在查詢這一點上,二者差距不大。因為唯一索引查到了就完事了,普通索引則是查到了還要繼續直到查到第一個不符合的。因為頁是基本讀寫單位,所以基本上一次都能讀進來k=5,所以查詢二者差不多
更新
這一點是值得說的,二者的差異主要在change buffer上,這是一個緩解反復磁盤寫入io的插件。
假設要更新數據頁A,但A現在不在內存里,就先不從磁盤讀,而是先把更新操作緩存在change buffer里,等到下次需要查詢訪問A時,A自然會加載進內存,這時候再把change buffer里的緩存過的更新操作給執行了。把change buffer的數據寫到數據頁上這個操作叫merge,除了剛才說的,后臺線程也會定期自動merge,數據庫關閉時候也會merge。
上面說的change buffer雖然是好,但是唯一索引卻用不了,也就是說實際上只有普通索引才能用。為啥呢?因為唯一索引需要判定我當前寫入的數據合理不,也就是說得判定唯一性,那得把頁A讀進內存才能比較呀,所以change buffer實際上它用不到。
建議
所以建議,盡量使用普通索引啊!