В настоящее время у меня есть логика обновления, написанная на 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, а логика обновления запускает еще один запрос на создание этого индекса - это означает, что индекс создается / создается дважды или даже чаще.
Первый IПредполагается, что при создании индекса конкретная запись вносится в таблицу, прежде чем она заполняется значениями.Но, похоже, это не так, потому что запрос
SHOW INDEX FROM my_table WHERE Key_name = 'my_key';
возвращает FALSE, даже когда этот индекс только создается.
Мой вопрос: есть ли способ проверить через MySQL / PHPесли индекс существует ИЛИ только создается, чтобы я мог предотвратить его создание несколько раз?