MySQL -- Innodb中的change buffer


change buffer是一種特殊的數據結構,當要修改的輔助索引頁不在buffer pool中時,用來cache對輔助索引頁的修改。對輔助索引頁的操作可能是insert、update和delete操作。等到相關的索引頁被讀入buffer pool中后,才會使用change buffer中的內容對輔助索引頁進行修改(即merge操作)。

和聚集索引不同,輔助索引通常是不唯一的,插入輔助索引通常也是隨機的。同樣,對輔助索引的刪除、更新也通常是不連續的。

等到相關的索引頁被讀入buffer pool中后,才會使用change buffer中的內容對輔助索引頁進行修改(即merge操作)可以避免大量的磁盤隨機訪問I/O。

間歇性的,在系統空閑或關閉過程中,會執行purge操作,將新的索引頁寫入磁盤。purge操作一次寫多個索引值會比每次修改后就立即寫入磁盤的效率高。

對change buffer的merge可能需要好幾個小時,如果被更新的輔助索引行比較多。在merge過程中,磁盤的I/O會增加,可能會引起其他查詢的性能的降低。
merge操作也可能發生在事務提交后。事實上,即使在實例重啟后,還會可能發生merge操作。

在內存中,change buffer會占用buffer pool的空間;在物理磁盤上,change buffer是system tablespace的一部分,所以對索引的修改在數據庫重啟后仍然存在change buffer中。

change buffer包含的特性也叫作change buffering,包含insert buffering、delete buffering、purge buffering。

change buffer中數據類型和總量由參數innodb_change_buffering和innodb_chagne_buffer_max_size配置。查看change buffer中數據的信息,可以通過show engine innodb status查看。

change buffer在老版本中被稱作insert buffer。

 

1.監控change buffer 

mysql> show engine innodb status\G
...
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 0, seg size 2, 0 merges
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
...

2.查看information_schema
information_schema.innodb_metrics提供了change buffer的統計信息名稱和說明:

mysql> select name, comment from information_schema.innodb_metrics where name like '%ibuf%';
+-----------------------------------------+-------------------------------------------------------------+
| name                                    | comment                                                     |
+-----------------------------------------+-------------------------------------------------------------+
| buffer_page_read_index_ibuf_leaf        | Number of Insert Buffer Index Leaf Pages read               |
| buffer_page_read_index_ibuf_non_leaf    | Number of Insert Buffer Index Non-Leaf Pages read           |
| buffer_page_read_ibuf_free_list         | Number of Insert Buffer Free List Pages read                |
| buffer_page_read_ibuf_bitmap            | Number of Insert Buffer Bitmap Pages read                   |
| buffer_page_written_index_ibuf_leaf     | Number of Insert Buffer Index Leaf Pages written            |
| buffer_page_written_index_ibuf_non_leaf | Number of Insert Buffer Index Non-Leaf Pages written        |
| buffer_page_written_ibuf_free_list      | Number of Insert Buffer Free List Pages written             |
| buffer_page_written_ibuf_bitmap         | Number of Insert Buffer Bitmap Pages written                |
| ibuf_merges_insert                      | Number of inserted records merged by change buffering       |
| ibuf_merges_delete_mark                 | Number of deleted records merged by change buffering        |
| ibuf_merges_delete                      | Number of purge records merged by change buffering          |
| ibuf_merges_discard_insert              | Number of insert merged operations discarded                |
| ibuf_merges_discard_delete_mark         | Number of deleted merged operations discarded               |
| ibuf_merges_discard_delete              | Number of purge merged  operations discarded                |
| ibuf_merges                             | Number of change buffer merges                              |
| ibuf_size                               | Change buffer size in pages                                 |
| innodb_ibuf_merge_usec                  | Time (in microseconds) spent to process change buffer merge |
+-----------------------------------------+-------------------------------------------------------------+
17 rows in set (0.00 sec)

mysql> 

information_schema.innodb_buffer_page提供了buffer pool中每個頁的元數據,包含change buffer 索引頁和change buffer位圖頁。
change buffer頁中page_type.ibuf_index表示change buffer索引頁;page_type.ibuf_bitmap表示change buffer位圖頁。

提醒:查看innodb_buffer_page會有很大的性能開銷。最好是在空閑時間或測試環境執行。

比如,可以查看change buffer的索引頁和位圖頁占據buffer pool的比例:

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 |
+---------------------+-------------+-------------------------------+
|                  14 |        8192 |                        0.1709 |
+---------------------+-------------+-------------------------------+
1 row in set (0.05 sec)

performance_schema還為高級性能監控提供了change buffer mutex的等待指令:

mysql> SELECT * FROM performance_schema.setup_instruments
    ->        WHERE NAME LIKE '%wait/synch/mutex/innodb/ibuf%';
+-------------------------------------------------------+---------+-------+
| NAME                                                  | ENABLED | TIMED |
+-------------------------------------------------------+---------+-------+
| wait/synch/mutex/innodb/ibuf_bitmap_mutex             | NO      | NO    |
| wait/synch/mutex/innodb/ibuf_mutex                    | NO      | NO    |
| wait/synch/mutex/innodb/ibuf_pessimistic_insert_mutex | NO      | NO    |
+-------------------------------------------------------+---------+-------+
3 rows in set (0.00 sec)

3.配置change buffer

可以通過參數innodb_change_buffering來控制是否啟用change buffer。

--all:		默認值。開啟buffer inserts、delete-marking operations、purges
--none:	不開啟change buffer
--inserts:	只是開啟buffer insert操作
--deletes:	只是開delete-marking操作
--changes:	開啟buffer insert操作和delete-marking操作
--purges:	對只是在后台執行的物理刪除操作開啟buffer功能

從5.6.2開始,參數innodb_change_buffer_max_size設置了change buffer可以占用buffer pool的百分比,默認是25,最大可以設置為50。

mysql> show variables like 'innodb_change_buffer_max_size';
+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| innodb_change_buffer_max_size | 25    |
+-------------------------------+-------+
1 row in set (0.00 sec)

mysql> 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM