Назад | Перейти на главную страницу

MySQL перестает отвечать при изменении основных таблиц

Это база данных InnoDB. Кэш запросов имеет размер 1,2 ГБ, в нем хранится 300 тыс. Запросов. Большинство кэшированных запросов относятся к 3 основным таблицам (длина данных 260 МБ плюс длина индекса 600 МБ). Каждый раз, когда я пытался вставить новую запись или обновить существующие записи в этих трех таблицах, MySQL сильно замедлился, как и сервер мертв. Я получаю "Тайм-аут", если открываю свой сайт в браузере.

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

Как я могу это оптимизировать?

Если все ваши таблицы находятся в формате InnoDB, вы должны сначала настроить innodb_buffer_pool_size настройка. Обычно я устанавливаю это значение примерно на 80% моей системной памяти. Также проверьте значение innodb_flush_log_at_trx_commit. Если он установлен по умолчанию 1, он будет сбрасываться при каждой фиксации транзакции, что может вызвать много операций ввода-вывода на диск (что, похоже, именно то, от чего вы страдаете). Если вам не требуется, чтобы ваша база данных была на 100% совместимой с ACID, вы должны установить это значение на 0 или 2. Вот соответствующий фрагмент со страниц MySQL:

Если значение innodb_flush_log_at_trx_commit равно 0, буфер журнала записывается в файл журнала один раз в секунду, и операция сброса на диск выполняется для файла журнала, но при фиксации транзакции ничего не происходит. Когда значение равно 1, буфер журнала записывается в файл журнала при каждой фиксации транзакции, а операция сброса на диск выполняется в файле журнала. Если значение равно 2, буфер журнала записывается в файл при каждой фиксации, но операция сброса на диск не выполняется. Однако сброс файла журнала происходит один раз в секунду, даже если значение равно 2. Обратите внимание, что раз в секунду промывка не гарантируется на 100% каждую секунду из-за проблем с планированием процессов.

Я обычно устанавливаю это на 2. Удачи!

Загрузите mysqltuner.pl и запустите его на сервере базы данных:

http://blog.mysqltuner.com/download/

Что-то ужасно неправильно оптимизировано.