我需要在大型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似乎适用于我的情况。
我错过了什么?
答案 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
部分。