Понимание MySQL Query Optimizer - PullRequest
       7

Понимание MySQL Query Optimizer

0 голосов
/ 08 октября 2019

Мы используем два сервера MySQL с одинаковой настройкой и репликацией мастер-мастер. Они расположены за балансировщиком нагрузки и получают почти такой же трафик, операторы и т. Д.

На сервере server1 дополнительно выполняется несколько заданий cron, что является единственным отличием.

Однако мывидно, что оптимизатор запросов в некоторых случаях ведет себя по-разному с одним и тем же запросом на обоих серверах.
В этих случаях мы должны использовать FORCE_INDEX для получения наилучших результатов на обоих серверах.

Основные вопросы:

  • Существуют ли какие-либо метаданные, которые хранятся где-то на сервере, который используется Оптимизатором запросов?
  • Если нам потребуется выполнить резервное копирование и восстановление базы данных (с помощью XtraBackup), будет ли оптимизатор запросов вести себя таким же образом или он построен с нуля?

Спасибо за любой ответ
Иоахим

1 Ответ

0 голосов
/ 15 октября 2019

Оптимизатор основывает свои действия частично на «статистике». Эти статистические данные поступают из явного ANALYZE TABLE или из определенных изменений в таблице, таких как «добавление более 10% в таблицу».

Нет ничего для синхронизации статистики между двумя Мастерами, поэтому они могутрасходиться. Даже запуск ANALYZE TABLE на обоих не обязательно приведет к их синхронизации. Это происходит из-за «случайных проб», которые вносятся в таблицу для составления статистики.

FORCE INDEX рискованно, потому что «то, что помогает сегодня, может повредить завтра».

Возможно, эточто происходит: у вас есть запрос, который находится на границе между выбором одного плана запроса и другого. Анализ Оптимизатора говорит, что они примерно эквивалентны, но (по разным причинам) это не так. Это может привести к тому, что один сервер будет выполнять одно (быстрый план запросов), а другой - что-то другое (плохой план запросов).

Не существует «надежного» и «согласованного» способа решения вашей проблемы.

Давайте попробуем заняться этим по-другому. Укажите запрос, EXPLAIN и SHOW CREATE TABLE. может быть лучшим индексом и / или переформулировкой запроса, которая полностью устраняет проблему и, возможно, выполняется быстрее, чем любой из ваших текущих планов запросов.

...