Запретить создание индекса, когда он уже встроен в MySQL / PHP - PullRequest
0 голосов
/ 23 ноября 2018

В настоящее время у меня есть логика обновления, написанная на 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если индекс существует ИЛИ только создается, чтобы я мог предотвратить его создание несколько раз?

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

----- еще не выпущено 5.7.0 Milestone 10 - Функциональность добавлена ​​или изменена - -----

Сервер теперь выдает предупреждение, если создается индекс, который дублирует существующийиндекс или ошибка в строгом режиме SQL.( Ошибка # 37520 , Ошибка # 11748842)

Итак, ...

  • Обновление как минимум до 5,7
  • Включить строгий режим
  • Проверьте ошибку.

В качестве альтернативы, покопайтесь в information_schema.KEY_COLUMN_USAGE, чтобы узнать, существует ли эквивалентный индекс.

0 голосов
/ 23 ноября 2018

Существует способ увидеть прогресс создания индекса в MySql, как описано здесь: https://www.percona.com/blog/2014/02/26/monitor-alter-table-progress-innodb_file_per_table/.

Но я думаю, что было бы слишком много сделать, если это можно сделать гораздо более простым способом.

Мое предложение состояло бы в том, чтобы оставить переменную lock установленной каждый раз, когда пользователь собирается создать индекс.Когда другой пользователь пытается выполнить скрипт, переменная lock проверяется, установлена ​​она или нет, и только когда она не установлена, скрипт переходит к созданию индекса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...