在mysql中的FK之前创建索引

在mysql中的FK之前创建索引,mysql,indexing,innodb,Mysql,Indexing,Innodb,我有一张不大的桌子,大约2米左右的行。 因为一些业务规则,我不得不在这个表上添加一个新的引用。 现在应用程序正在写入值,但不使用列。 现在,我需要将所有空行更新为正确的值,创建一个FK,并开始使用列 但是这个表有很多读取操作,当我试图修改表以添加FK时,表被锁定,读取查询被阻塞 有什么办法可以加快速度吗? 将所有字段保留为空值有助于加快速度(因为我认为无需检查值是否有效)? 在之前创建索引有助于加快速度 在postgres中,我可以创建一个无效的FK,然后验证它(这只会导致行锁,而不是表锁),M

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

但是这个表有很多读取操作,当我试图修改表以添加FK时,表被锁定,读取查询被阻塞

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


在postgres中,我可以创建一个无效的FK,然后验证它(这只会导致行锁,而不是表锁),MySQL中也有类似的功能吗?

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

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

ALTER TABLE mytable ADD INDEX (col1, col2) LOCK=NONE;
如果这不起作用(比如如果它因为无法识别LOCK=NONE语法而给出错误),那么您就没有使用支持在线DDL的MySQL版本。看


如果在不锁定表的情况下无法构建索引或定义外键,那么我建议尝试免费工具。我们在我的工作中使用它,我们每天在生产中进行许多模式更改,而不阻止任何查询。

这对我很有帮助!谢谢,还有一个技巧可以做到: