【发布时间】: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