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

标签 php mysql sql database indexing

目前我有一个用 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/

相关文章:

php - hook表单提交,如何增加数据库字段?

php - 准备下拉列表并多次使用

php - 用户测试/组测试的架构

sql - 来自三个表的SQL SELECT

使用自动故障转移时 PHP MongoDB 错误

PHP 复制粘贴检测器

mysql - 亿级表优化查询

mysql - 编写一个 sql 查询来查找在 R128 房间中遇到的类的名称

php - mysql 查询错误没有重复 - 但如何让它跳过错误并继续执行其他错误?

javascript - 将 HTML 报告转换为 PDF