gpt4 book ai didi

php - 当索引已经在 MySQL/PHP 中构建时,防止创建索引

转载 作者:行者123 更新时间:2023-11-29 16:38:49 25 4
gpt4 key购买 nike

目前我有一个用 PHP 编写的更新逻辑,它可以更新 MySQL 数据库中的多个表。每当执行某个 PHP 脚本时,更新逻辑都会检查数据库是否是最新的(基于保存在其他地方的版本标志),如果不是,则应用所有必要的更新。

更新逻辑的一部分应该为特定表列添加索引:

if ($database_version < 1337) {
if (!get_results("SHOW INDEX FROM my_table WHERE Key_name = 'my_key';")) {
query("ALTER TABLE my_table ADD INDEX(my_key);");
}

set_database_version(1337);
}

如您所见,我执行了以下设置:

  • 检查数据库是否低于特定版本标志
  • 如果是:检查表 my_table 中键 my_key 的索引是否存在
  • 如果没有:创建索引
  • 更新数据库的版本标志

现在想象一下更新逻辑由用户触发。由于表很大,索引的创建可能需要一段时间。在索引创建完成之前,另一个用户触发更新逻辑。由于索引尚未完成,初始检查返回 FALSE,更新逻辑会为此索引启动另一个创建查询 - 这意味着索引会被构建/创建两次甚至更频繁。

首先,我假设在创建索引期间,在填充值之前会将特定条目放入表中。但情况似乎并非如此,因为查询

SHOW INDEX FROM my_table WHERE Key_name = 'my_key';

即使该索引刚刚创建,也会返回 FALSE。

我的问题:有没有办法通过 MySQL/PHP 检查索引是否存在或刚刚创建,以便我可以防止它被多次创建?

最佳答案

有一种方法可以在 MySql 中查看索引创建进度,如下所述: https://www.percona.com/blog/2014/02/26/monitor-alter-table-progress-innodb_file_per_table/ .

但我想如果可以通过更简单的方式实现这一点,那就太多了。

我的建议是每当用户要创建索引时都设置一个lock变量。当其他用户尝试执行脚本时,将检查 lock 变量是否已设置,并且仅当未设置时,脚本才会继续创建索引。

关于php - 当索引已经在 MySQL/PHP 中构建时,防止创建索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53451308/

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