首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MySQL表中添加索引时的CPU使用问题

在MySQL表中添加索引时的CPU使用问题
EN

Stack Overflow用户
提问于 2020-08-16 05:52:23
回答 1查看 121关注 0票数 0

有数十亿行的桌子。当我试图向表中添加索引时,我使用的是MySQL 5.7,这需要很长时间,而且它也会锁定表。结果,许多查询在队列中等待,服务器负载增加。

我不明白在向表中添加索引时,创建表锁,即元数据锁。请您解释一下为什么会发生这种情况,并提供解决方案。

创建表

代码语言:javascript
复制
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命令

代码语言:javascript
复制
ALTER TABLE `user_log` ADD INDEX (`user_id`, `created_date`);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-16 06:30:43

为什么mysql需要锁表

首先,mysql中有很多DDL操作,如alter tabledrop table...These语句与DML操作不同,比如insertupdateselect.The DDL操作都会改变表模式,而DML操作只会影响行。

其次,innodb中有多个众所周知的锁,如行锁、下键lock.But MetaData锁等,很少有人knows.The DDL操作会获得独占的MetaData锁来保证数据的一致性,这将阻止DML operations.For在没有MetaData锁的情况下操作会导致数据异常,可以引用bug#989

如何在不阻塞的情况下实现DDL

目前,mysql支持在线ddl不需要锁就可以执行DDL操作。在online中没有魔法,它只是创建一个具有相同结构的新表,并在新表上操作DDL语句,然后用旧表重命名新表。

若要将索引添加到没有锁的表中,则可以使用以下语句格式:

代码语言:javascript
复制
ALTER TABLE my_table ADD INDEX my_table__idx (my_column), ALGORITHM=INPLACE, LOCK=NONE;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63433597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档