change buffer是存放二级索引的没有在bufferr pool的变更页的缓存区,变更的buffer是由insert,update,delete等操作导致的。等页被加载进buffer pool中后会将change buffer中的页合并。
二级索引通常是非唯一的,插入也是很随机的顺序,更新删除也都不是在邻近的位置,所以change buffer就避免了很多的随机io的产生。puge操作会在系统空闲或慢关闭的时候定时将变更页写入到磁盘上去。
change buffer合并在有大量的二级索引页更新或有很多影响行的情况下会花费很长的时间。change buffer会占用innodb buffer pool的部分空间,在磁盘上,change buffer会占用系统表空间,所以在数据库重启后,索引变更仍然被缓存。在change buffer中被缓存的数据可以使用innodb_change_buffering控制,我们也可以调整innodb_change_buffer_max_size配置change buffer的大小。
可以在show engine inndodb status\G中查看change buffer的信息。
在insert buffer and adaptive hash index部分。
使用下面的语句也能监控
SELECT NAME, COMMENT FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME LIKE ‘%ibuf%’\G
查看change buffer占用innodb buffer的大小
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;
在新版本的innodb中,change buffer的数据是放在了共享表空间中的。在ibd恢复数据后,可能需要repaire表重建二级索引。