InnoDB change buffer 一种重要的数据变更日志

Change buffer的主要目的是将对二级索引的数据操作缓存下来,以此减少二级索引的随机IO,并达到操作合并的效果。


在MySQL5.5之前的版本中,由于只支持缓存insert操作,所以最初叫做insert buffer,只是后来的版本中支持了更多的操作类型缓存,才改叫change buffer。


当更新/插入的非聚集索引的数据所对应的页不在内存中时(对非聚集索引的更新操作通常会带来随机IO),会将其放到一个insert buffer中,当随后页面被读到内存中时,会将这些变化的记录merge到页中。当服务器比较空闲时,后台线程也会做merge操作

 

但change buffer会占用buffer pool,并且在非聚集索引很少时,并不总是必要的,反而会降低buffer pool做data cache的能力。




The INFORMATION_SCHEMA.INNODB_BUFFER_PAGE table provides metadata about each page in the buffer pool, including change buffer index and change buffer bitmap pages. Change buffer pages are identified by PAGE_TYPE. IBUF_INDEX is the page type for change buffer index pages, and IBUF_BITMAP is the page type for change buffer bitmap pages. 


For example, you can query the INNODB_BUFFER_PAGE table to determine the approximate number of IBUF_INDEX and IBUF_BITMAP pages as a percentage of total buffer pool pages. 


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 |

+---------------------+-------------+-------------------------------+


没有对比,不知道这个结果的性能好坏。