MySQL перестает отвечать при изменении основных таблиц
Это база данных InnoDB. Кэш запросов имеет размер 1,2 ГБ и 300 000 запросов в кеше. Большинство кэшированных запросов относятся к 3 основным таблицам (длина данных 260 МБ плюс длина индекса 600 МБ в целом). Каждый раз, когда я пытался вставить новую запись или обновить существующие записи в этих 3 таблицах, MySQL сильно замедлялся, как будто сервер мертв. Я получаю "Тайм-аут", если я открываю свой сайт в браузере.
Я проверяю статистику Munin, она показывает, что 95% кеша запросов очищается после операции, поэтому я предполагаю, что внезапная перегрузка была вызвана вставкой записей в таблицы с интенсивным чтением. А во время перегрузки Munin просто показывает белую полосу на графике, чтобы вы могли понять, насколько плохой была ситуация.
Как я могу оптимизировать это?
2 ответа
Если все ваши таблицы в формате 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/
Что-то звучит ужасно неправильно оптимизировано.