【发布时间】:2018-01-08 15:24:17
【问题描述】:
我需要在一个大型 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 来断言在 DDL 操作期间允许并发 DML。如果可能,MySQL 会自动允许并发 DML。"
“您可以指定 LOCK=SHARED 来断言在 DDL 操作期间允许并发查询。MySQL 会在可能的情况下自动允许并发查询。”
https://dev.mysql.com/doc/refman/5.6/en/innodb-create-index-limitations.html 的所有限制似乎都不适用于我的情况。
我错过了什么?
【问题讨论】:
-
对于那些投票结束的人,如何在编程范围之外询问如何创建 MySQL 索引? Stackoverflow 上有大量 MySQL 问题。
-
从技术上讲,这是一个 DBA 问题dba.stackexchange.com - 不是一个“编程”问题(例如,它不是如何在代码中“编写”SQL 查询)。
标签: mysql