【问题标题】:Prevent creation of index when its already getting built in MySQL/PHP防止在 MySQL/PHP 中构建索引时创建索引
【发布时间】:2019-04-26 08:07:59
【问题描述】:

目前我有一个用 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 检查索引是否存在或刚刚创建,这样我就可以防止它被多次创建?

【问题讨论】:

  • 我不确定这是否是正确的答案,但请尝试DESCRIBE table 看看是否返回索引。你可以在这里阅读更多关于它的信息dev.mysql.com/doc/refman/8.0/en/getting-information.html
  • 听起来您正在编写自己的迁移工具。您是否考虑过使用预先存在的实现?

标签: php mysql sql database indexing


【解决方案1】:

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

但我想如果能以更简单的方式实现这一点,那就太难了。

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

【讨论】:

  • 我之前也想过这个问题,但是一个问题是PHP脚本的最大执行时间。当创建索引的时间超过最大执行时间时,将无法解除锁定。
  • @Asgaros - 在启动长 SQL 后中止 PHP 是不切实际的。 SQL 将继续在 MySQL 服务器中运行,因为它会与客户端进行检查,直到完成。
  • @rick-james 我知道,但它是用于特定 Web 应用程序的更新逻辑,用于具有不同数据库大小和配置的不同服务器。因此,对于定义的最大执行时间等设置,我完全没有影响。
  • @Asgaros - 可以在 PHP 中调用set_time_limit(..) 执行查询以确定数据集(或其他)是“大”还是“小”。例如,我在一个可能正在处理少量或大量 inage 的 PHP 脚本中执行此操作。
【解决方案2】:

----- 尚未发布 5.7.0 Milestone 10 -- 添加或更改功能 -- -----

如果创建的索引与现有索引重复,或者在严格 SQL 模式下出现错误,服务器现在会发出警告。 (Bug #37520,错误 #11748842)

所以,...

  • 至少更新到 5.7
  • 开启严格模式
  • 检查错误。

或者,翻阅information_schema.KEY_COLUMN_USAGE 以发现是否存在等效索引。

【讨论】:

    猜你喜欢
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 2013-06-02
    相关资源
    最近更新 更多