CPU 将 INDEX 添加到 MySQL 时出现利用率问题 table

CPU utilisation issue while adding INDEX to MySQL table

一个 table 有数十亿行。我正在使用 MySQL 5.7 当我尝试向 table 添加索引时,它需要很长时间并且它也会锁定 table。 结果,许多查询在队列中等待,服务器负载增加。

我不明白向 table 添加索引会创建 table 锁,即元数据锁。 能否解释一下为什么会这样,并提供解决方案。

创建TABLE

CREATE TABLE `user_log` (
`id` bigint(14) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`latitude` decimal(10,6) NOT NULL,
`longitude` decimal(10,6) NOT NULL,
`created_date` date DEFAULT NULL,
PRIMARY KEY (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=20000000000 DEFAULT CHARSET=latin1

更改命令

ALTER TABLE `user_log` ADD INDEX (`user_id`, `created_date`);

为什么mysql需要锁table
首先,mysql中有很多DDL操作,比如alter tabledrop table...这些语句不同于DML操作,比如[=15] =]、updateselectDDL 操作将更改 table 模式,而 DML 操作仅影响行。
其次,innodb中有多个well-known锁,比如行锁,next-keylock.ButMetaData锁很少有人knows.TheDDL操作会获取独占MetaData锁保证数据一致性,会阻塞DML operations.For 什么情况下 DDL 操作会导致没有MetaData锁的数据异常,可以参考 bug#989 .

如何在没有阻塞的情况下进行 DDL

如今,mysql支持在线ddl进行无锁操作DDL。 在线ddl没有魔法,就是新建一个结构相同的table,然后在新的[=48=上运行DDL语句,然后将新的table重命名为旧的[=] 48=].

要将索引添加到 table 而不会导致 UPDATE/INSERT 锁定,可以使用以下语句格式:

ALTER TABLE my_table ADD INDEX my_table__idx (my_column), ALGORITHM=INPLACE, LOCK=NONE;