MySQL InnoDB下关于MVCC的一个问题的分析
程序员文章站
2022-07-06 07:54:03
这个是网友++C++在群里问的一个关于MySQL的问题,本篇文章实验测试环境为MySQL 5.6.20,事务隔离级别为REPEATABLE-READ ,在演示问题前,我们先准备测试环境。准备一个测试表test以及一个存储过程循环往test表里面插入记录。 CREATE TABLE test( `id... ......
这个是网友++C++在群里问的一个关于MySQL的问题,本篇文章实验测试环境为MySQL 5.6.20,事务隔离级别为REPEATABLE-READ ,在演示问题前,我们先准备测试环境。准备一个测试表test以及一个存储过程循环往test表里面插入记录。
CREATE TABLE test
(
`id` int(11) primary key not null,
`name` char(255)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
delimiter &&
drop procedure if exists prc_insert;
create procedure prc_insert(in cnt int)
begin
declare i int;
set i=1;
while i < cnt do
insert into test(id, name) select i, CONCAT('name',i) from dual;
set i = i+1;
end while;
end &&
delimiter ;
在线程ID为14的会话中,开启事务,然后执行查询test的SQL语句
mysql> select connection_id() from dual;
+-----------------+
| connection_id() |
+-----------------+
| 14 |
+-----------------+
1 row in set (0.00 sec)
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from test;
然后在线程ID为12的会话中,循环往表test里面插入1000000记录
mysql> select connection_id() from dual;
+-----------------+
| connection_id() |
+-----------------+
| 12 |
+-----------------+
1 row in set (0.00 sec)
mysql> call prc_insert(1000000);
Query OK, 1 row affected (8 min 32.11 sec)
在执行循环插入的这段时间里(SQL执行需要几分钟时间),我们在线程ID 为14的会话中反复执行select * from test这个SQL语句,你会发现该SQL的执行时间变长。那么引起SQL语句执行时间变长的原因是什么呢? 如何解释得通呢?