我需要在一个大的InnoDB生产表上创建索引,而且希望在任何情况下都不会锁定表。我正在使用MySQL 5.6 (.38-83.90)。
我尝试过
create index my_index on my_table(col1, col2);
两个列都不是主键。col1是一个外键。
这完全锁定了表格。其他查询被阻塞,出现了"等待表格元数据锁定"的情况,导致我的网站崩溃。我不得不终止create index查询。
从https://dev.mysql.com/doc/refman/5.6/en/innodb-create-index-overview.html上可以看到,我认为它不会锁定表格: "...不需要语法更改...在创建或删除索引时,表格仍然可用于读写操作。"
我知道我可以设置LOCK=NONE或LOCK=SHARED,但我不知道是否有必要,如果有必要,我应该使用哪一个。
"您可以指定LOCK=NONE来声明允许并发DML在DDL操作期间。当可能时,MySQL会自动允许并发DML。"
"您可以指定LOCK=SHARED来声明允许在DDL操作期间进行并发查询。当可能时,MySQL会自动允许并发查询。"
https://dev.mysql.com/doc/refman/5.6/en/innodb-create-index-limitations.html中的任何限制似乎都不适用于我的情况。
我错过了什么?