功能介绍
Innodb 的 buffer pool(BP)通过在 midpoint 插入新页的方式尽可能避免了全表扫描等操作对 BP 的污染,但效果有限。为了进一步提高 BP 的性能,该功能支持在 BP 中设置独立的一块空间,专门用来执行类似全表扫描的操作。当没有全表扫描操作时,这个空间可以完全被正常的 LRU list 使用。而当存在全表扫描操作时,使用 CLOCK 淘汰算法管理这个空间,通过数据页面的物理隔离,避免了全表扫描操作对 BP 的污染。
支持版本
内核版本 TXSQL 8.0 3.1.15及以上。
适用场景
适用于需要频繁对数据库进行全表扫描和进行大规模数据操作的场景。
使用说明
参数说明
参数名 | 动态 | 类型 | 默认 | 参数值范围 | 说明 |
innodb_txsql_independent_buffer_pool_evict_interval | yes | ulong | 50 | 0-50 | 后台线程主动淘汰 CLOCK list 的时间单位,越小 CLOCK list 页面在内存中驻留越久,设置为0可以快速清空 CLOCK list。 |
innodb_txsql_independent_buffer_pool_list_move_action | yes | ulong | 0 | 0-2 | CLOCK list 页面被正常 query 读到后的行为: 0代表不做任何变化。 1代表同步移动到 LRU list。 2代表异步移动到 LRU list,移动操作交给后台线程。 |
innodb_txsql_independent_buffer_pool_size_pct | yes | ulong | 5 | 1-100 | 隔离 BP 能使用的 BP 最大比例。比例越高,对正常 query 的影响越大,但是全表扫描的操作效果越高。 |
innodb_txsql_independent_buffer_pool_users | yes | string | nullptr | | 通过指定用户的方式使用 BP 隔离,具体配置方式为"user1@ip1;user2@ip2"。 |
innodb_txsql_independent_buffer_pool_enabled | yes | bool | ON | ON/OFF | buffer pool 隔离的开关,关闭后不会再有新的页面进入隔离空间,旧的隔离页面将尽快淘汰。 |
innodb_txsql_independent_buffer_pool_max_expire_minutes | yes | bool | 120 | 1-1440 | CLOCK list 页面在 BP 隔离中最大淘汰时间。控制逻辑:use_times 代表页面的活跃度,是 CLOCK 算法的一个重要指标。页面每次被读取则将其加1,后台线程每隔一个时间单位将所有页面的 use_times 减1。innodb_txsql_independent_buffer_pool_max_expire_minutes 用于控制 use_times 的上限。 |
新增状态如下:
参数 | 类型 | 说明 |
txsql_independent_buffer_pool_usage_counts | longlong | 使用 BP 隔离的 SQL 数量。 |
BP 隔离的使用方法1
使用名为 independent 的 hint 手动触发对 BP 隔离的使用,具体使用方法为:在 DML 的 INSERT、DELETE、UPDATE 等关键词后立刻添加
/*+ independent /
,例如:select /*+ independent */ id from t;
需要注意的是将/*+ independent */
加在非前述的任意位置皆无法触发对 BP 隔离的使用,例如:select id /*+ independent */ from t;
。BP 隔离的使用方法2
通过 innodb_txsql_independent_buffer_pool_users 设置默认使用 BP 隔离的用户,此类用户简称为 BP 隔离用户。在 innodb_txsql_independent_buffer_pool_users 中新增、修改、删除 BP 隔离用户后,该用户是否默认使用 BP 隔离的行为只在新连接生效,已建立连接的行为不受影响。为方便排障,在
show detail processlist;
中新增 Independent_buffer_pool_session 状态来表示连接是否默认使用 BP 隔离。BP 隔离与 Prepare statement、Stored Procedure 的关系
Prepare statement、Stored Procedure 都支持通过 方法1 使用 BP 隔离。
Prepare statement、Stored Procedure 是否使用 BP 隔离与创建的用户无关,只与执行的用户有关。
BP 隔离的观察
BP 隔离功能在 show engine innodb status 中添加了对 BP 隔离空间(CLOCK list)的监控。在 BUFFER POOL AND MEMORY 模块中添加 CLOCK list 长度和分布的情况。具体而言,use_times 代表页面的活跃度,是 CLOCK 算法的一个重要指标。页面每次被读取则将其加1,后台线程每隔一个时间单位将所有页面的 use_times 减1,当 use_times 为0时将页面淘汰或刷盘。在 BUFFER POOL AND MEMORY 模块中对 use_times 相同的页面进行了聚类,分为 [0,10),[10, 100),[100, 1000),[1000, 10000),[10000, 100000),[100000, unlimited) 6个范围。