【问题标题】:Creating a index before a FK in mysql在mysql中的FK之前创建索引
【发布时间】:2024-04-20 08:20:01
【问题描述】:

我有一张不太大的桌子,大约 2M~ 行。 因为一些业务规则,我不得不在这个表上添加一个新的引用。 现在应用程序正在写入值但不使用该列。 现在我需要将所有空行更新为正确的值,创建一个 FK,然后开始使用该列。

但是这个表有很多读取,当我尝试更改表以添加 FK 时,表被锁定并且读取查询被阻塞。

有什么方法可以加快这个速度? 将所有字段保留为 NULL 值有助于加快速度(因为我认为无需检查值是否有效)? 之前创建索引有助于加快速度?

在 postgres 中我可以创建一个无效的 FK 然后对其进行验证(这只会导致行锁,而不是表锁),在 MySQL 中是否有类似的东西?

【问题讨论】:

    标签: mysql indexing innodb


    【解决方案1】:

    构建索引需要时间。外键需要索引。如果适当的列上已经有索引,FK 将使用它。如果没有索引,则添加 FK 约束会隐式构建一个新索引。这需要一段时间,同时表被锁定。

    从 MySQL 5.6 开始,构建索引应该允许并发读写查询。您可以尝试明确说明:

    ALTER TABLE mytable ADD INDEX (col1, col2) LOCK=NONE;
    

    如果这不起作用(例如由于无法识别 LOCK=NONE 语法而导致错误),那么您使用的不是支持在线 DDL 的 MySQL 版本。见https://dev.mysql.com/doc/refman/5.6/en/innodb-online-ddl-operations.html

    如果你不能在不锁定表的情况下建立索引或定义外键,那么我建议尝试免费工具pt-online-schema-change。我们在我的工作中使用它,并且我们每天在生产中进行许多架构更改,而不会阻塞任何查询。

    【讨论】:

    最近更新 更多