Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建索引锁MySQL 5.6表。如何避免这种情况?_Mysql - Fatal编程技术网

创建索引锁MySQL 5.6表。如何避免这种情况?

创建索引锁MySQL 5.6表。如何避免这种情况?,mysql,Mysql,我需要在一个大型InnoDB生产表上创建一个索引,并希望在不以任何方式锁定该表的情况下执行此操作。我使用的是MySQL 5.6(.38-83.90) 我试过了 create index my_index on my_table(col1, col2); 两列都不是主键。col1是一个外键 这完全把桌子锁上了。其他查询因“等待表元数据锁”而暂停。使我的网站瘫痪。我不得不终止创建索引查询 因此,我认为它不会锁定表:“……不需要进行语法更改……在创建或删除索引时,表仍可用于读写操作。” 我看到我可

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

我试过了

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查询)。