mysql - 在 MySQL 中的 FK 之前创建索引

标签 mysql indexing innodb

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

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

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

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

最佳答案

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

从MySQL 5.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

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

关于mysql - 在 MySQL 中的 FK 之前创建索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57592987/

相关文章:

python - 如何使用 mysql.connector (Python) 执行简单命令

python - 缺少日期的 Pandas Date MultiIndex - 滚动总和

mysql - 如何查看表或列的所有外键?

mysql - 表中单行的SELECT索引

mysql - 发送数据花费太长时间但索引已创建

RR下的mysql innodb engine next-key lock问题

java - MyISAM 存储引擎在 Java Hibernate 中更可取吗?

PHP mySQL - 替换字符串中的一些字符串

MySQL:为具有多个 BETWEEN 表达式的 WHERE 子句建立索引

php - 更新 id 等于 3 的表,并在 updatecount 列中的现有值上加一