在 mysql 中的 FK 之前创建索引

Creating a index before a FK in mysql

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

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

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

在 postgres 中我可以创建一个无效的 FK 然后验证它(只导致行锁,而不是 table 锁),在 MySQL?

中有类似的东西

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

从MySQL5.6开始,构建索引应该允许并发读写查询。您可以尝试将其明确化:

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

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

如果不锁定 table 就无法建立索引或定义外键,那么我建议尝试使用免费工具 pt-online-schema-change。我们在我的工作中使用它,并且我们每天在生产中进行许多模式更改,而不会阻止任何查询。