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> CREATE TABLE t(id BIGINT PRIMARY KEY AUTO_INCREMENT, a INT);
Query OK, 0 rows affected (0.02 sec)
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> -- 使用 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;