欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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语句执行时间变长的原因是什么呢? 如何解释得通呢?