创建索引锁定MySQL 5.6表。怎么避免呢?

时间:2018-01-08 15:24:17

标签: mysql

我需要在大型InnoDB生产表上创建一个索引,并希望在不以任何方式锁定表的情况下执行此操作。我正在使用MySQL 5.6(.38-83.90)。

我试过

parseFloat()

两列都不是主键。 col1是外键。

嗯,这完全锁定了桌子。其他查询因“等待表格元数据锁定”而停滞不前,使我的网站陷入困境。我不得不杀死创建索引查询。

从这个https://dev.mysql.com/doc/refman/5.6/en/innodb-create-index-overview.html我认为它不会锁定表:“...不需要语法更改......在创建或删除索引时,表仍然可用于读写操作。 “

我看到我可以设置LOCK = NONE或LOCK = SHARED,但我不认为它应该是必要的,或者,如果是,我需要使用哪一个。

“您可以指定LOCK = NONE以断言在DDL操作期间允许并发DML。 MySQL会尽可能自动允许并发DML。

“您可以指定LOCK = SHARED来断言在DDL操作期间允许并发查询。 MySQL会尽可能自动允许并发查询。

没有任何限制https://dev.mysql.com/doc/refman/5.6/en/innodb-create-index-limitations.html似乎适用于我的情况。

我错过了什么?

1 个答案:

答案 0 :(得分:1)

我的猜测(只是猜测)是你错过了ALGORITHM=INPLACE声明中的CREATE INDEX条款。

CREATE INDEX my_index ON my_table(col1, col2) ALGORITHM=INPLACE ;
                                              ^^^^^^^^^^^^^^^^^

还要注意获取和保存元数据锁的事务。

https://dev.mysql.com/doc/refman/5.6/en/metadata-locking.html

引用my_table的任何事务将继续在该表上保留元数据锁,直到提交或回滚事务为止。我建议您查看TRANSACTIONS输出的SHOW ENGINE INNODB STATUS部分。