NoteDeep
本页讨论:
  • Change Buffer更改缓冲区介绍以及实现原理
  • 监控更改缓冲区

Change Buffer更改缓冲区介绍以及实现原理

Change Buffer更改缓冲区是一种特殊的数据结构。
有一些处于缓冲池外的二级索引页(比较冷的数据),当这些pages数据发生update/insert/delete时,Change Buffer更改缓冲区会把这些更改缓存下来。稍后在页面被其他读取操作加载到缓冲池中时合并。


与聚簇索引不同,二级索引通常是非唯一的,插入到二级索引中是以相对随机的顺序进行的。同样,删除和更新可能会影响不相邻位的二级索引页。

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

定期在系统空闲时刻,清除操作将更新后的索引页写入磁盘。与每个值立即写入磁盘相比,清除操作可以更有效地把一系列索引值写入磁盘块。

当有许多二级索引和受影响的行需要更新时,Change Buffer的合并可能需要几个小时。在此期间,磁盘I/O会增加,受磁盘限制的查询会减慢。提交事务后,Change Buffer合并也可能会继续发生。事实上,Change Buffer合并可能会在服务器重新启动后仍继续发生。

在内存中,更改缓冲区占据了InnoDB buffer pool缓冲池的一部分。
在磁盘上,更改缓冲区是system tablespace系统表空间的一部分,因此在数据库重新启动时,索引更改仍保存在缓存中。

缓存在更改缓冲区中的数据类型由innodb_change_buffering配置控制。

监控更改缓冲区

以下配置可用于更改缓冲区的监控:

InnoDB Standard Monitor输出包括了更改缓冲区的状态信息。
使用如下命令:
mysql> SHOW ENGINE INNODB STATUS\G
更改缓冲区状态信息位于INSERT BUFFER AND ADAPTIVE HASH INDEX标题下,类似于以下内容:

-------------------------------------
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

  • size: 在更改缓冲区中使用到的页数量.
  • free list len: 更改缓冲区中空闲页的数量
  • seg size: 页面带来的更改缓冲区的大小
  • merges: 表示总合并次数
  • merged operations - insert: 插入的记录数
  • merged operations - delete mark: 删除的记录数
  • merged operations - delete: 清除的记录数
  • discarded operations - insert: The number of insert merge operations discarded.
  • discarded operations - delete mark: The number of delete merge operations discarded.
  • discarded operations - delete: The number of purge merge operations discarded.


INFORMATION_SCHEMA.INNODB_METRICS表提供了InnoDB Standard Monitor输出中的大部分数据点,以及其他数据点。

mysql> SELECT NAME, COMMENT FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME LIKE '%ibuf%'\G


INFORMATION_SCHEMA.INNODB_BUFFER_PAGE表提供有关缓冲池中每个页面的元数据,包括索引和位图页面。更改缓冲区页面由PAGE_TYPE标识。 IBUF_INDEX是更改缓冲区中索引页的页面类型,IBUF_BITMAP是更改缓冲区中位图页的页面类型。



您可以查询INNODB_BUFFER_PAGE表以确定IBUF_INDEXIBUF_BITMAP页面的大致数量占总缓冲池页面的百分比。


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 |
+---------------------+-------------+-------------------------------+



评论列表

    Change Buffer更改缓冲区介绍以及实现原理
    监控更改缓冲区