Обновляются ли индексы MySQL (5.7) после многих операций UPDATE / INSERT? - PullRequest
2 голосов
/ 07 февраля 2020

Я испытываю похожую «ошибку» с https://bugs.mysql.com/bug.php?id=94068, где созданный мной индекс для моих сгенерированных столбцов, кажется, неэффективен после того, как я выполняю много операций INSERT/UPDATE на мой стол Но если я удаляю и воссоздаю индекс, мои запросы молниеносно. Я не уверен, что при наличии достаточного времени первоначально созданный индекс «обновится» сам по себе и снова станет производительным.

Автор ошибки отмечает, что они наблюдают это поведение не только для индекса на сгенерированный столбец, а также при записи фактических столбцов с помощью триггера. Я не совсем понимаю объяснение MySQL разработчика относительно того, почему это ожидаемое поведение, поскольку удаление и повторное создание индекса резко повышает производительность ... разве это ожидается ??

Просто интересно, сталкивался ли кто-то еще с этим? эта проблема, и как они справились с этим. Спасибо за вашу помощь!

1 Ответ

1 голос
/ 08 февраля 2020

Короткий ответ: Нет.

Длинный ответ:

Насколько программа может сказать, индексы, UNIQUE или нет, обновляются "немедленно".

На INSERT все уникальные ключи должны быть проверены на наличие «дубликата ключа» до того, как INSERT завершится (или не получится из-за дублирования ключа). Неуникальные обновления ключа помещаются в «буфер изменений» для возможной записи на диск. Однако любое использование индекса также проверяет наличие в буфере изменений, поэтому вы фактически не замечаете существование буфера изменений.

Если вопрос касается изменения плана EXPLAIN с течением времени, то есть отчет об ошибке, кажется, говорит, это другое дело. Вы должны перефразировать свой Вопрос с учетом этого.

Воссоздание индекса - тяжелая операция. В следующий раз сделайте ANALYZE TABLE. Это обновляет статистику для всех индексов в таблице. Вот что вы можете испытать:

  1. Запрос прекрасно использует индекс.
  2. Вы добавляете много новых строк, что делает статистику не совсем правильной больше.
  3. Поскольку каждый запрос самостоятельно решает, какой индекс использовать, или даже использовать какой-либо индекс, ваш запрос может «внезапно» выбрать использование индекса, который ранее не использовался, или наоборот.
  4. ANALYZE TABLE активно обновляет статистику.
  5. Теперь ваш запрос может go вернуться к предыдущему способу использования (или нет) нужного индекса.

Было бы лучше поговорить о конкретном c запросе и его SHOW CREATE TABLE. Мы можем предпринять некоторые действия, чтобы ускорить запрос и / или предотвратить возникшую у меня проблему.

...