Mysql-普通索引和惟一索引

普通索引

image.png

普通索引頁記錄的是普通索引以及主鍵值,故查詢非主鍵字段的時候,須要回表.數據庫

普通索引數據頁內部經過二分法來定位記錄.緩存

普通索引在查詢時須要額外多查詢一次下一條記錄,而惟一索引查到則不會繼續往下查spa

change buffer

change buffer在內存中有拷貝,也會被寫入磁盤
在更新數據時,若是數據直接在內存中就直接寫入內存,若是不在內存中須要從磁盤中讀取這個數據頁,下次查詢須要訪問這個數據頁時,先讀入數據頁,再執行changebuffer中的相關頁操做即merge操做線程

何時觸發merge?日誌

  • 訪問這個數據頁
  • 後臺線程會按期 merge
  • 數據庫正常關閉

什麼條件下使用change buffer?
惟一索引在執行更新操做時須要判斷是否違反惟一性約束,必須先讀取數據,因此惟一索引沒法使用change buffer
因此只有普通索引纔可使用索引

change buffer多少大小?
change buffer 用的是 buffer pool 裏的內存,經過參數 innodb_change_buffer_max_size來設置,當值爲50時,表示最多隻佔用buffer pool 的 50%,設置爲0時,表示關閉change buffer內存

何時使用change buffer呢?
merge 的時候是真正進行數據更新的時刻,而 change buffer 的主要目的就是將記錄的變動動做緩存下來,因此在一個數據頁作 merge 以前,change buffer 記錄的變動越多(也就是這個頁面上要更新的次數越多),收益就越大。
對於寫多讀少的業務,頁面在寫完後不會被立馬訪問到時使用效果最好,如帳單類、日誌類的系統
change buffer 對於機械硬盤,效果很是顯著,當相似歷史數據的庫,應儘可能使用普通索引,而後把change buffer儘可能開大.it

redo log和change buffer的區別innodb

image.png

  1. page1在內存中,直接更新內存;
  2. page2不在內存,就在這change buffer 區域記錄下「我要往 Page 2 插入一行」這個信息
  3. 將上述兩個動做記入 redo log 中(圖中 3 和 4)
  4. 虛線箭頭爲後臺執行操做,不影響更新時間

綜上所述,整個過程僅順序寫了兩處內存,寫了一處磁盤
redo log主要節省的是隨機寫磁盤的IO消耗,而change buffer主要節省的是隨機讀磁盤的消耗class

相關文章
相關標籤/搜索