创建索引锁MySQL 5.6表。如何避免这种情况?
我需要在一个大型InnoDB生产表上创建一个索引,并希望在不以任何方式锁定该表的情况下执行此操作。我使用的是MySQL 5.6(.38-83.90) 我试过了创建索引锁MySQL 5.6表。如何避免这种情况?,mysql,Mysql,我需要在一个大型InnoDB生产表上创建一个索引,并希望在不以任何方式锁定该表的情况下执行此操作。我使用的是MySQL 5.6(.38-83.90) 我试过了 create index my_index on my_table(col1, col2); 两列都不是主键。col1是一个外键 这完全把桌子锁上了。其他查询因“等待表元数据锁”而暂停。使我的网站瘫痪。我不得不终止创建索引查询 因此,我认为它不会锁定表:“……不需要进行语法更改……在创建或删除索引时,表仍可用于读写操作。” 我看到我可
create index my_index on my_table(col1, col2);
两列都不是主键。col1是一个外键
这完全把桌子锁上了。其他查询因“等待表元数据锁”而暂停。使我的网站瘫痪。我不得不终止创建索引查询
因此,我认为它不会锁定表:“……不需要进行语法更改……在创建或删除索引时,表仍可用于读写操作。”
我看到我可以设置LOCK=NONE或LOCK=SHARED,但我不认为这是必要的,或者,如果是,我需要使用哪一个
“您可以指定LOCK=NONE来声明在DDL操作期间允许并发DML。MySQL会在可能的情况下自动允许并发DML。”
“您可以指定LOCK=SHARED来声明在DDL操作期间允许并发查询。MySQL会在可能的情况下自动允许并发查询。”
这些限制似乎都不适用于我的情况
我错过了什么 我的猜测(只是猜测)是您缺少CREATE INDEX
语句中的ALGORITHM=INPLACE
子句
CREATE INDEX my_index ON my_table(col1, col2) ALGORITHM=INPLACE ;
^^^^^^^^^^^^^^^^^
还要注意获取和持有元数据锁的事务
任何引用了my_表的事务将继续在该表上保持元数据锁,直到提交或回滚该事务为止。我建议检查
SHOW ENGINE INNODB STATUS
output的TRANSACTIONS
部分。对于投票关闭的人,如何询问如何创建不在编程范围内的MySQL索引?在Stackoverflow上有很多MySQL问题。从技术上讲,这是一个DBA问题,而不是“编程”问题(例如,它不是如何在代码中“编写”SQL查询)。