Это база данных 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/
Что-то ужасно неправильно оптимизировано.