Innodb特性之change buffer

樸所羅門發表於2020-10-26

change buffer官方說明: https://dev.mysql.com/doc/refman/5.7/en/innodb-change-buffer.html

change buffer官方解答: https://dev.mysql.com/doc/refman/5.7/en/faqs-innodb-change-buffer.html


設計背景:

與聚集索引不同,二級索引通常是非唯一的,像delete和update操作的二級索引樹中通常都是順序相對隨機不相鄰的索引頁,

這樣會照成大量隨機I/O


工作機制:

DML(insert,update,delete)操作使用到的二級索引頁如果不在buffer pool中,就把它快取到buffer pool的change buffer中。後續再進行合併操作,批量寫回disk( master thread在伺服器空閒時和slow shutdown期間會合並緩衝更改)。可避免大量隨機I/O

注:change buffer不支援descending index,Clustered indexes,full-text indexes,spatial indexes 

Content is described in the surrounding text.


控制引數:

innodb_change_buffering :change buffer快取級別有

  innodb_change_buffering values include:

  • all 預設開啟

    The default value: buffer inserts, delete-marking operations, and purges.

  • none

    Do not buffer any operations.

  • inserts

    Buffer insert operations.

  • deletes

    Buffer delete-marking operations.

  • changes (其實update操作就是做的 inserts and delete-marking)

    Buffer both inserts and delete-marking operations.

  • purges

    Buffer physical deletion operations that happen in the background.


innodb_change_buffer_max_size:change buffer是buffer pool中一塊區域,5.6版本後預設大小是buffer pool的25%,引數 innodb_change_buffer_max_size  控制。

注:在記憶體中, change buffer佔用buffer pool的一部分。在磁碟上, change buffer是system tablespace的一部分,當資料庫伺服器關閉時,索引更改將在其中緩衝。


使用監控

mysql> SHOW ENGINE INNODB STATUS\G
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 0, seg size 2, 0 merges
#size:change buffer中使用的頁數。change buffer大小等於seg size-(1+free list len)
#1+表示change buffer header page使用
seg size:更改緩衝區的大小,以頁為單位。
merged operations:
 insert 0, delete mark 0, delete 0
discarded operations:
 insert 0, delete mark 0, delete 0
Hash table size 4425293, used cells 32, node heap has 1 buffer(s)
13577.57 hash searches/s, 202.47 non-hash searches/s


change buffer 佔用率

mysql> SELECT (SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE
       WHERE PAGE_TYPE LIKE 'IBUF%') AS change_buffer_pages,
       (SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE) AS total_pages,
       (SELECT ((change_buffer_pages/total_pages)*100))
       AS change_buffer_page_percentage;
+---------------------+-------------+-------------------------------+
| change_buffer_pages | total_pages | change_buffer_page_percentage |
+---------------------+-------------+-------------------------------+
|                  25 |        8192 |                        0.3052 |
+---------------------+-------------+-------------------------------+


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25583515/viewspace-2727658/,如需轉載,請註明出處,否則將追究法律責任。

相關文章