You need to enable JavaScript to run this app.
文档中心
云数据库 MySQL 版

云数据库 MySQL 版

复制全文
下载 pdf
性能
Buffered Scan
复制全文
下载 pdf
Buffered Scan
本文介绍云数据库 MySQL 版提供的 buffered scan 功能的相关信息。​
支持版本​
  • MySQL 5.7 版本,且内核小版本为 MySQL 5.7.44_20251215 及以上。​
  • MySQL 8.0 版本,且内核小版本为 MySQL 8.0.43_20251215 及以上。​
  • MySQL 8.4 版本,且内核小版本为 MySQL 8.4.7_20260415 及以上。​
说明​
您可通过查看实例信息查看实例的内核小版本。如您实例的内核小版本未在受支持的内核小版本范围内,您可手动升级实例内核小版本。​
背景信息​
社区版 MySQL 在点查询、小范围查询这种典型事务型负载上性能较好,但在大范围查询、全表扫描这种典型分析型负载上,还有一定的性能提升空间。​
在大范围查询、全表扫描的场景下,存储引擎需要扫描大量的记录,并对扫描到的每条记录进行处理,因此处理每条记录的流程需要执行很多次。通过对性能热点的分析,我们发现 InnoDB 处理每条记录的流程中,存在大量冗余逻辑,这些冗余逻辑在处理每条记录时都需要执行一遍,严重拖慢了查询的性能。​
特性说明​
云数据库 MySQL 版对扫描方式进行了优化,优化后的扫描方式被称为 buffered scan。在使用 buffered scan 时,存储引擎会一次性扫描多条记录并存放在 buffer 中,之后统一进行处理。优化后的扫描方式消除了原本处理每条记录都要执行的冗余逻辑,大幅提升了大范围查询、全表扫描等场景的性能。​
使用说明​
参数说明​
云数据库 MySQL 版提供了以下可修改参数,用于 buffered scan 功能进行设置。​
​
参数名称​
默认值​
是否需要重启实例以生效​
取值范围​
级别​
参数描述​
loose_buffered_scan​
OFF​
否​
​
[ON|OFF]​
GLOBAL/SESSION​
用于开启或关闭 buffered scan 扫描方式。取值:​
  • ON:开启。​
  • OFF:关闭。​
loose_buffered_scan_threshold​
1000​
否​
[0, 18446744073709551615]​
GLOBAL/SESSION​
执行 buffered scan 扫描方式的扫描行数下限。当优化器预估的扫描行数超过了该参数的设置值时,才会执行 buffered scan 扫描方式。​
​
使用示例​
在以下示例代码中展示了使用 buffered scan 扫描方式的操作流程。​
​
mysql> -- 在当前 session 中允许使用 buffered scan 扫描方式​
mysql> SET SESSION loose_buffered_scan = ON;​
Query OK, 0 rows affected (0.00 sec)​
​
mysql> -- 在当前 session 中调整 buffered scan 扫描方式的生效阈值​
mysql> SET SESSION loose_buffered_scan_threshold = 10;​
Query OK, 0 rows affected (0.00 sec)​
​
mysql> ​
mysql> -- 创建测试表​
mysql> CREATE TABLE t(id BIGINT PRIMARY KEY AUTO_INCREMENT, a INT);​
Query OK, 0 rows affected (0.02 sec)​
​
mysql> -- 导入测试数据​
mysql> INSERT INTO t(a) VALUES(0);​
Query OK, 1 row affected (0.00 sec)​
​
mysql> INSERT INTO t(a) SELECT a + (SELECT COUNT(*) FROM t) FROM t;​
Query OK, 1 row affected (0.01 sec)​
Records: 1 Duplicates: 0 Warnings: 0​
​
mysql> INSERT INTO t(a) SELECT a + (SELECT COUNT(*) FROM t) FROM t;​
Query OK, 2 rows affected (0.00 sec)​
Records: 2 Duplicates: 0 Warnings: 0​
​
mysql> INSERT INTO t(a) SELECT a + (SELECT COUNT(*) FROM t) FROM t;​
Query OK, 4 rows affected (0.00 sec)​
Records: 4 Duplicates: 0 Warnings: 0​
​
mysql> INSERT INTO t(a) SELECT a + (SELECT COUNT(*) FROM t) FROM t;​
Query OK, 8 rows affected (0.01 sec)​
Records: 8 Duplicates: 0 Warnings: 0​
​
mysql> ​
mysql> -- 使用 EXPLAIN 语句查看执行计划,Extra 列出现 Using buffered scan 说明使用了 buffered scan 扫描方式​
mysql> EXPLAIN FORMAT=TRADITIONAL SELECT COUNT(a) FROM t;​
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+---------------------+​
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |​
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+---------------------+​
| 1 | SIMPLE | t | NULL | ALL | NULL | NULL | NULL | NULL | 16 | 100.00 | Using buffered scan |​
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+---------------------+​
1 row in set, 1 warning (0.01 sec)​
​
mysql> -- 使用 buffered scan 扫描方式执行全表扫描​
mysql> SELECT COUNT(a) FROM t;​
+----------+​
| COUNT(a) |​
+----------+​
| 16 |​
+----------+​
1 row in set (0.00 sec)​
​
注意事项​
  • buffered scan 扫描方式只支持 InnoDB 存储引擎。​
  • buffered scan 扫描方式不支持分区表。​
  • buffered scan 扫描方式不支持包含了 BLOB、TEXT 或 JSON 字段的表。​
  • buffered scan 扫描方式不支持对主索引、唯一索引的点查询。这些查询最多返回一行数据,无需使用 buffered scan 扫描方式进行优化。​
性能数据​
测试环境​
  • 实例规格:云数据库 MySQL 版通用型 8C32G​
  • 实例版本:MySQL 8.0​
测试步骤​
  1. 创建 TPC-H 中的 lineitem 表,导入约 60,000,000 行数据。​
  1. 分别在开启和关闭 buffered scan 时扫描 lineitem 表:​
​
mysql> -- 在当前 session 中关闭 buffered scan 扫描方式​
mysql> SET SESSION loose_buffered_scan = OFF;​
Query OK, 0 rows affected (0.00 sec)​
​
mysql> ​
mysql> -- 扫描 lineitem 表​
mysql> SELECT SUM(l_quantity) FROM lineitem;​
+-----------------+​
| SUM(l_quantity) |​
+-----------------+​
| 1529738036.00 |​
+-----------------+​
1 row in set (17.87 sec)​
​
mysql> -- 在当前 session 中打开 buffered scan 扫描方式​
mysql> SET SESSION loose_buffered_scan = ON;​
Query OK, 0 rows affected (0.00 sec)​
​
mysql> ​
mysql> -- 扫描 lineitem 表​
mysql> SELECT SUM(l_quantity) FROM lineitem;​
+-----------------+​
| SUM(l_quantity) |​
+-----------------+​
| 1529738036.00 |​
+-----------------+​
1 row in set (15.36 sec)​
​
测试结果​
从上述测试可以看到,关闭 buffered scan 扫描方式时,扫描 lineitem 表耗时 17.87 秒;打开 buffered scan 扫描方式时,扫描 lineitem 表耗时 15.36 秒。使用 buffered scan 扫描方式后,性能提高了约 16.34%。​
最近更新时间:2026.05.28 11:52:21
这个页面对您有帮助吗?
有用
有用
无用
无用