gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:18:49 24 4
gpt4 key购买 nike

我有一个不太大的表,大约 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com