【问题标题】:Create index locks MySQL 5.6 table. How to avoid that?创建索引锁 MySQL 5.6 表。如何避免这种情况?
【发布时间】: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


【解决方案1】:

我的猜测(只是猜测)是您缺少CREATE INDEX 语句中的ALGORITHM=INPLACE 子句。

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 的事务都将继续持有该表的元数据锁,直到事务被提交或回滚。我建议检查SHOW ENGINE INNODB STATUS 输出的TRANSACTIONS 部分。

【讨论】:

    猜你喜欢
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多