MySQL資料庫 普通索引和唯一索引的區別?

2021-10-04 01:33:53 字數 2109 閱讀 9171

上一節,我們學習了關於索引的基本知識——>資料庫必學——關於mysql索引的基礎知識都在這!介紹了索引的一些知識,這次我們繼續學習資料庫索引,今天主要**一下在mysql中,使用普通索引和唯一索引有什麼不一樣的地方,幫助大家更深入學習到索引。

唯一索引:一種索引,不允許具有索引值相同的行,從而禁止重複的索引或鍵值。系統在建立該索引時檢查是否有重複的鍵值,並在每次使用 insert 或 update 語句新增資料時進行檢查。如果已經存在了該值,就會拒接插入和刪除。

那麼現在我們來看看在不同的操作下它們帶來的效能問題吧!

查詢情況

在查詢的情況下,還是乙個學生表,id為表的索引,如果我們要查詢id為2020001的同學情況是怎麼樣的呢?

使用唯一索引當查到 2020001 這條資料後由於唯一索引的性質,不會有相同的id,所以就不會繼續查詢下去了

看起來唯一索引會比普通索引快,那到底會快多少呢?

答: 微乎其微

是不是有點不可思議呢? 那如果你知道innodb 對資料的儲存方式,這也許就解釋的通了。

innodb的資料是按資料頁為單位來讀寫的。也就是說,當需要讀一條記錄的時候,並不是將這個記錄本身從磁碟讀出來,而是以頁為單位,將其整體讀入記憶體。在innodb中,每個資料頁的大小預設是16kb

更新操作

change buffer

談到更新操作,就不得不介紹乙個新知識出來了 ——change buffer

當需要更新乙個資料頁時,如果資料頁在記憶體中就直接更新,而如果這個資料頁還沒有在記憶體中的話,在不影響資料一致性的前提下,inoodb會將這些更新操作快取在change buffer中,這樣就不需要從磁碟中讀入這個資料頁了。在下次查詢需要訪問這個資料頁的時候,將資料頁讀入記憶體,然後執行change buffer中與這個頁有關的操作。通過這種方式就能保證這個資料邏輯的正確性。

需要說明的是,雖然名字叫作change buffer,實際上它是可以持久化的資料。change buffer在記憶體中有拷貝,也會被寫入到磁碟上

將change buffer中的操作應用到原資料頁,得到最新結果的過程稱為merge,觸發 merge 的情況有:

顯然,使用change buffer 先記錄下更新操作不僅可以提高語句執行速度,減少磁碟訪問;能減少讀入資料對記憶體的占用,提高記憶體利用率

好,認識了change buffer 後接著來**上面的問題,關於普通索引和唯一索引的更新過程。

已經知道使用change buffer 能明顯的優化更新語句的效率,那麼你來想想,使用唯一索引查詢資料的時候,會使用到change buffer 嗎?

是的,不可以的!

為什麼呢? 還是因為唯一索引不允許資料鍵重複,這就使得每一次的插入修改時,都需要使得資料唯一不能違反這個約束,反映在操作上就是引擎將會載入資料頁到記憶體後判斷是否存在該要修改的值。既然已經在修改的時候資料就載入到記憶體,那也就沒有必要使用change buffer 了。

換而言之,只有普通索引可以使用change buffer✅,而唯一索引不可?‍♂️。

到這裡,你是不是和我一樣覺得對於普通索引使用change buffer 很有用呢,那是不是普通索引的所有場景,使用change buffer都可以起到加速作用呢?

我們知道,change buffer 的作用就是可以多進行修改但卻少進行讀寫磁碟,也就是merge 的次數盡量少,盡量在積攢了一定數量的更新步驟後,再統一進行merge。反過來說,如果乙個業務每進行一次的更新就要馬上進行一次的查詢,也就是馬上就需要將資料頁載入到記憶體中,那其實使用change buffer 的作用並不大,反而還需要增加維護change buffer 的代價。所以,對於寫多讀少的業務來說,此時change buffer的使用效果最好。這種業務模型常見的就是賬單類、日誌類的系統。

mysql普通索引和唯一索引選擇

mysql普通索引和唯一索引的區別 所以,普通索引和唯一索引的主要區別在於插入和修改,換個說法就是能否使用change buffer,那麼change buffer就是是什麼,有什麼用就是我們接下來要討論的話題。change buffer中儲存的是mysql的更新操作 從名字上就能看出來 當我們在更...

MySQL 普通索引 唯一索引和主索引

1 普通索引 普通索引 由關鍵字key或index定義的索引 的唯一任務是加快對資料的訪問速度。因此,應該只為那些最經常出現在查詢條件 wherecolumn 或排序條件 orderbycolumn 中的資料列建立索引。只要有可能,就應該選擇乙個資料最整齊 最緊湊的資料列 如乙個整數型別的資料列 來...

MySQL 普通索引 唯一索引和主索引

1.普通索引 普通索引 由關鍵字key或index定義的索引 的唯一任務是加快對資料的訪問速度。因此,應該只為那些最經常出現在查詢條件 where column 或排序條件 order by column 中的資料列建立索引。只要有可能,就應該選擇乙個資料最整齊 最緊湊的資料列 如乙個整數型別的資料...