您好,登錄后才能下訂單哦!
mysql中的change buffer是什么,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
首先:正常insert的時候,也是首先要判斷哪個物理頁(包括數據頁和索引頁)可以insert,然后把這個物理塊讀取到buffer pool,然后再在內存執行insert 操作,然后再刷新到磁盤;
0)Change Buffer為何提高性能
它緩存的是一個索引頁的 dml的操作,而不是具體的數據頁,具體的數據頁直接就修改了,對非聚集非唯一的索引頁修改的時候才可能用到change buffer。當 buffer pool中沒有某個索引頁,并且需要dml操作這個索引頁的數據的時候,不需要先從磁盤讀取該索引頁到buffer pool,直接把該操作記錄到cahnge buffer 中,這里就減少了一次隨機io,然后等下次業務需要訪問這個索引頁的時候,再把這個頁讀取到buffer poo中,然后change buffer記錄的操作和buffer pool中剛讀進來的索引頁進行merge 操作。
提高性能的地方還有一點是:對于非聚集非唯一索引的更新或者插入操作,不是每次插入或者更新操作完, 都直接插入到索引頁中,而是先判斷插入的非聚集索引頁是否在緩沖池中,如果在,則直接插入,不在則放到change buffer中,然后以一定的頻率和情況進行change buffer和輔助索引葉子的merge(合并)操作,這時通常可以將多個索引葉子的dml操作合并到一個操作里(因為在一個索引頁中),這里也提高了性能
綜上所述 cahnge buffer 性能的提升在于兩點:
一:當需要修改的索引頁不在buffer pool的時候,不需要先把索引頁讀取到buffer pool,這里減少了io
二:將多個索引葉子的dml操作合并到一個操作里(因為在一個索引頁中),批量merge,這里也提高了性能;
1)change buffer的內容
Change Buffer是一種特殊的數據結構,緩存對二級索引頁面的更改并且這些頁面不在Buffer Pool中(注意緩存的是對索引葉子的修改,而不是具體的索引葉子)。緩存的changes可能由 Insert 、Delete 和 Update的結果導致。稍后在頁面被其他讀取操作加載到Buffer Pool的時候合并,
簡而言之:Change buffer的主要目的是將對二級索引的數據操作緩存下來,以此減少二級索引的隨機IO,并達到操作合并的效果。
3)change buffer 只針對輔助索引而言
對主鍵索引無效;對輔助索引葉子節點的更改才可能借助change buffer ,如果該列上沒有索引,那么就不會借助change buffer了!
4)緩沖池有change buffer 信息固然不錯,但他不是單純是緩存池的一部分,change buffer 和數據頁一樣,change buffer 是一個B+樹,放在共享表空間,默認也就是idbata1,向change buffer 寫數據也是需要隨機io,但有change buffer后,當buffer 中沒有需要修改的葉子塊的時候,你不需要把葉子塊讀進innodb_buffer_cahce中(減少的就是這里的io)只需要把改變寫進cahnge buffer即可,然后cahnge buffer中排序最后等待和真正的葉子節點數據合并!批量合并!所以如果更新操作不頻繁的時候,并且更新后立馬需要讀取該頁的時候,change buffer 的機制會增加部分io消耗! change buffer 減少了從內存讀取硬盤的隨機讀IO(數據頁)操作,換做成批量順序merge,redo log減少了隨機寫log操作
5).之所以需要滿足索引是輔助索引,并且是非唯一的
因為在插入緩沖時,數據庫并不去查找索引頁來判斷插入的記錄的唯一性,如果去查找肯定又會有離散讀取的情況發生(隨機io),從而導致change buffer 失去意義!
6) change buffer的相關參數
1 innodb_change_buffering 默認是all支持所有DML操作
2 innodb_change_buffer_max_size,默認是25,即緩沖池的1/4。最大可設置為50,采用默認即可
7).合并的操作是在 buffer pool里面進行的
當下一次需要加載這個頁面的時候,也就是這個頁面有需求的時候,會將Change Buffer內的更改合并到Buffer Pool,隨后當服務器在空閑的時候,這個更改會刷到disk(磁盤)上, 或者在不繁忙的時候進行merge,這時候merger操作也是發生在buffer pool;
8).為什么change buffer 存的是 buffer pool中沒有的索引頁的操作?
因為如果在buffer pool中,那么就直接dml操作對應的索引頁了,change buffer 存在就是為了當需要操作的索引頁不在buffer pool中,然后不需要立馬去磁盤讀取該索引頁,只有當buffer pool中不存在的時候才可能用到change buffer;
9) 除了數據頁被訪問,還有哪些場景會觸發刷寫緩沖中的數據呢?
還有這么幾種情況,會刷寫緩沖中的數據:
(1)有一個后臺線程,會認為數據庫空閑時;
(2)數據庫緩沖池不夠用時;
(3)數據庫正常關閉時;
(4)redo log寫滿時;
畫外音:幾乎不會出現redo log寫滿,此時整個數據庫處于無法寫入的不可用狀態。
10)什么業務場景,適合開啟InnoDB的寫緩沖機制?
先說什么時候不適合,如上文分析,當:
(1)數據庫都是唯一索引;
(2)或者,寫入一個數據后,會立刻讀取它;
這兩類場景,在寫操作進行時(進行后),本來就要進行進行頁讀取,本來相應頁面就要入緩沖池,此時寫緩存反倒成了負擔,增加了復雜度。
什么時候適合使用寫緩沖,如果:
(1)數據庫大部分是非唯一索引;
(2)業務是寫多讀少,或者不是寫后立刻讀取;
可以使用寫緩沖,將原本每次寫入都需要進行磁盤IO的SQL,優化定期批量寫磁盤。
畫外音:例如,賬單流水業務。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。