MariaDB обновление запроса занимает много времени - PullRequest
0 голосов
/ 06 сентября 2018

В настоящее время у меня есть некоторые проблемы с нашей репликацией mysql. Мы используем настройку мастер-мастер для восстановления после отказа.

Сама репликация работает, и я считаю, что это правильно. Но у нас возникают проблемы с некоторыми запросами, выполнение которых занимает очень много времени.

Пример:

| 166 | база данных | Подключить | 35 | обновление | обновление xx набор xx = 'xx' где xx = 'xx' и xx = 'xx' | 0,000 |

Этим запросам на обновление иногда требуется более 20-30 секунд, и из-за этого репликация начинает отставать и в течение дня задерживается на пару часов. Странная часть в том, что он в конце концов догонит другого мастера.

Таблица имеет размер около 100 мм и около 70 ГБ. На главном сервере, где выполняются запросы, они занимают менее секунды.

Обе конфигурации, mysql и server, практически идентичны, и мы попытались оптимизировать таблицу и запросы, но пока безуспешно.

Какие-нибудь рекомендации, которые мы могли бы попытаться решить, это? Дайте мне знать, если я смогу предоставить вам дополнительную информацию.

Использование:

MariaDB 10.1.35 - CentOS 7.5.1804

1 Ответ

0 голосов
/ 10 сентября 2018

Ключевой аспект этого - сколько строк вы обновляете:

  • Если процент низкий (менее 5% строк), то индекс может помочь.

  • В противном случае, если вы обновляете большое количество строк (больше 5%), оптимальным будет полное сканирование таблицы. Если у вас есть миллионы строк, это будет медленно. Может быть, разделение таблицы может помочь, но я бы сказал, что у вас мало шансов улучшить ее.

Я предполагаю, что вы обновляете небольшой процент строк, чтобы вы могли использовать индекс. Посмотрите на условие в операторе WHERE. Если это выглядит так:

ГДЕ col1 = 'xx' и col2 = 'yy'

Тогда индекс по этим столбцам ускорит ваш запрос. В частности:

create index ix1 on my_table (col1, col2);

В зависимости от селективности ваших столбцов, перевернутый индекс может быть быстрее:

create index ix2 on my_table (col2, col1);

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

...