Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3|回复: 0

新观点MySQL 中,Change Buffer 是什么它有什么作用

[复制链接]

36万

主题

0

回帖

109万

积分

超级版主

Rank: 8Rank: 8

积分
1094080
发表于 前天 16:29 | 显示全部楼层 |阅读模式
在 MySQL 的 InnoDB 存储引擎中,Change Buffer(变更缓冲) 是一种用于化二级索引(Secondary Index)更新性能的机制。它的主要作用是减少由于频繁更新二级索引而导致的随机 I/O 操作,从而提升整体数据库的性能。这篇文章,我们一起来分析 Change Buffer。



1. 什么是二级索引
二级索引(Secondary Index)是建立在非主键列上的索引,用于加速基于这些非主键列的查询操作。与主键索引不同,二级索引不用于仅有标识表中的记录,而是用于提高查询效率,尤其是在进行查找、筛选和排序操作时。

二级索引与主键索引的区别:

特性

主键索引(Primary Index)

二级索引(Secondary Index)

定义

基于表的主键列创建的索引,用于仅有标识记录

基于非主键列创建的索引,用于加速查询操作

仅有性

通常仅有(除非显式允许重复)

可以是仅有的也可以是非仅有的

数据组织方式

聚簇索引(Clustered Index),数据按主键排序

非聚簇索引(Non-Clustered Index),数据不按索引排序

数量限制

每个表只能有一个主键索引

每个表可以有多个二级索引

存储方式

数据存储与索引存储在一起(聚簇存储)

索引存储与数据存储分开,索引包含指向际数据行的指针

常见的二级索引类型:

(1) 普通索引(Non-Unique Index):

不强制列值仅有。
适用于需要加速查询但不要求仅有性的场景。
(2) 仅有索引(Unique Index):

强制索引列的值仅有。
除了加速查询外,还能保证数据的仅有性。
(3) 全文索引(Full-Text Index)(主要用于文本搜索):

适用于对文本数据进行全文搜索的场景,如搜索引擎、内容管理系统等。

(4) 空间索引(Spatial Index):

适用于地理空间数据的索引,如地理信息系统(GIS)中的位置数据。

2. Change Buffer是什么
Change Buffer(变更缓冲) 是 MySQL InnoDB 存储引擎中的一个化机制,主要用于提升二级索引(Secondary Index)在高并发写操作下的性能。它通过将对二级索引的修改暂时缓存在内存中,减少磁盘的随机 I/O 操作,从而提高数据库的整体性能。

3. Change Buffer的工作原理
缓冲二级索引的修改: 当执行插入、更新或删除操作时,如果涉及到二级索引的变更,InnoDB 并不会立即将这些修改应用到对应的索引页上。相反,这些变更会被记录到 Change Buffer 中。
批量应用变更: Change Buffer 会将这些索引变更按页进行聚合,待到适当的时机(例如缓冲区达到一定大小,或者后台合并线程执行时),再将这些变更批量地应用到际的索引页中。这种批量处理的方式能够有效减少磁盘的随机 I/O 操作,提高写入效率。
4. Change Buffer势和不足
(1) 势

减少随机 I/O: 二级索引的频繁更新通常会导致大量的随机磁盘写操作,特别是在高并发的写场景下。通过将变更先缓存在 Change Buffer 中,能够将这些随机写操作转化为更高效的顺序写操作,显著降低磁盘 I/O 压力。
提高写性能: 由于减少了磁盘的随机访问次数,整体的写入性能得到了提升,特别是在有大量更新、插入或删除操作的环境中效果尤为明显。
化资源利用: Change Buffer 通过延迟和合并变更,化了缓冲区的使用,避免了频繁的小范围写入,提高了资源利用率。
(2) 不足

只针对二级索引:Change Buffer 仅适用于二级索引的修改,不影响主键索引(聚簇索引)。主键的变更因为直接关联到数据行的位置,不适合使用 Change Buffer 进行化。
内存占用:Change Buffer 使用内存来缓存变更,如果缓冲区过大,可能会占用过多的系统内存。但通常情况下,InnoDB 会根据配置和际负载自动调节缓冲区的使用。
适用场景有限:对于读多写少的应用,或者二级索引更新频率较低的场景,Change Buffer 的势可能不明显。而在高并发、高更新的写密集型场景中,Change Buffer 的化效果才会显现出来。
5. 配置相关
(1) 开启/关闭 Change Buffer: 在较新的 MySQL 版本中,Change Buffer 默认是开启的,但可以通过调整参数 innodb_change_buffering 来配置其行为,如:

all:缓存所有类型的二级索引变更。
none:禁用 Change Buffer。
其他选项可以根据具体需求进行选择。
如下示例展示了如何设置Change Buffer的行为:

复制
mysql> set global innodb_buffer_pool_size=1073741824;
Query OK, 0 rows affected (0.00 sec)

mysql> show global variables like 'innodb_buffer_pool_size';
+-------------------------+------------+
| Variable_name           | Value      |
+-------------------------+------------+
| innodb_buffer_pool_size | 1073741824 |
+-------------------------+------------+
1 row in set (0.00 sec)
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
(2) 监控 Change Buffer 的使用情况: 可以通过查询 InnoDB 的状态信息,如 SHOW ENGINE INNODB STATUS,来观察 Change Buffer 的使用情况和效果,以便进行性能调。

6. 总结
本文,我们分析了 Change Buffer,它是 InnoDB 存储引擎中一个重要的化机制,通过缓冲和批量处理二级索引的变更,有效减少了随机 I/O 操作,提升了数据库的写入性能。理解和合理配置 Change Buffer,有助于在高负载的数据库环境中现更高的性能表现。

然而换言之,我们应该深入了解主流数据库的发展规律,为整个行业带去新的生机,让市场焕发生机。悦数图数据库是一款完全自主研发的国产图数据库和原生分布式图数据库,具有高性能,易扩展,安全稳定,自主可控的特点.万亿级数据仅需毫秒级查询延时,应用于金融风控,实时推荐,知识图谱等业务场景。https://www.yueshu.com.cn/

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|足球新闻网

GMT+8, 2025-4-22 10:33 , Processed in 0.074780 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表