繁体   English   中英

执行ALTER时的MySQL InnoDB行/表锁定

[英]MySQL InnoDB row/table lock when performing ALTER

我创建了一个如下所示的sysbench表,其中包含25,000,000条记录(大小为5.7G):

Create Table: CREATE TABLE `sbtest1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `k` int(11) NOT NULL DEFAULT '0',
  `c` char(120) NOT NULL DEFAULT '',
  `pad` char(60) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `k_1` (`k`)
) ENGINE=InnoDB AUTO_INCREMENT=25000001 DEFAULT CHARSET=latin1

然后直接使用ALTER语句在c上添加索引,这花费了大约18分钟来更新表,如下所示:

mysql> alter table sbtest1  add index c_1(c);
Query OK, 0 rows affected (18 min 47.32 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show create table sbtest1\G
*************************** 1. row ***************************
       Table: sbtest1
Create Table: CREATE TABLE `sbtest1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `k` int(11) NOT NULL DEFAULT '0',
  `c` char(120) NOT NULL DEFAULT '',
  `pad` char(60) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `k_1` (`k`),
  KEY `c_1` (`c`)
) ENGINE=InnoDB AUTO_INCREMENT=25000002 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

在表更新过程的18分钟内,我尝试通过插入新记录并在表c列上更新现有记录来对表执行一些事务,而当我期望使用锁来防止这种情况发生时,所有这些都奏效了。 我一直都知道,在InnoDB表(尤其是大表)上执行ALTER可能会在整个过程中导致记录锁定,因此想知道为什么我无法执行插入和更新而不会出现任何问题吗?

以下是有关我的服务器的一些信息:

mysql> show variables like '%isolation%';
+-----------------------+-----------------+
| Variable_name         | Value           |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ |
| tx_isolation          | REPEATABLE-READ |
+-----------------------+-----------------+

mysql> select version()
    -> ;
+-----------+
| version() |
+-----------+
| 5.7.25-28 |
+-----------+

对我来说,现在好像在MySQL 5.7中,可以直接运行ALTER语句而不必担心锁了吗? 这是正确的结论吗?

更新当我尝试删除添加的索引c_1时,只花了不到一秒钟的时间,这也让我感到惊讶,因为我期望这比实际添加索引花费的时间更长。 我一直认为,添加索引既简单又快捷,但是由于必须更改整个表结构,因此删除或更新索引需要很长时间。 对此有些困惑吗???

添加二级索引可以就地完成,并允许并发DML。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM