【MySQL數據庫】普通索引和唯一索引的區別?

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

普通索引和唯一索引

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

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

查詢情況

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

在這裏插入圖片描述

  • 使用普通索引查到 2020001 這條數據後還會繼續查看下一條記錄是否符合條件,查詢到不符合,則查詢結束
  • 使用唯一索引當查到 2020001 這條數據後由於唯一索引的性質,不會有相同的ID,所以就不會繼續查找下去了

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

是不是有點不可思議呢? 那如果你知道InnoDB 對數據的存儲方式,這也許就解釋的通了。
InnoDB的數據是按數據頁爲單位來讀寫的。也就是說,當需要讀一條記錄的時候,並不是將這個記錄本身從磁盤讀出來,而是以頁爲單位,將其整體讀入內存。在InnoDB中,每個數據頁的大小默認是16KB

因爲引擎是按頁讀寫的,所以說,當找到ID = 2020001 的記錄的時候,它所在的數據頁就都在內存裏了。那麼,對於普通索引來說,要多做的那一次“ 查找和判斷下一條記錄 ”的操作,就只需要進行一次指針尋找和一次計算,當然不排除下一個數據是在下一頁當中,那樣就會比較麻煩些。
但是事實上,一個數據頁可以放近千個key,因此出現這種情況的概率會很低。所以,我們計算平均性能差異時,仍可以認爲這個操作成本對於現在的CPU來說可以忽略不計。

更新操作

Change buffer

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

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

需要說明的是,雖然名字叫作change buffer,實際上它是可以持久化的數據。change buffer在內存中有拷貝,也會被寫入到磁盤上

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

  • 除了訪問這個數據頁會觸發merge
  • 系統有後臺線程會定期merge
  • 在數據庫正常關閉(shutdown)的過程中,也會執行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的使用效果最好。這種業務模型常見的就是賬單類、日誌類的系統。

好了,今天的內容就是這些啦,相信這下你也能正確的分清楚普通索引和唯一索引啦,文章如果有什麼問題也歡迎大家指正,希望自己表達的能對你有所幫助,也歡迎大家點贊關注一起進步!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章