Как оптимизировать базу данных MySQL (innoDB)?

Привет, обстановка такая:
Машина - CPU 16 ядер, 64гб ОЗУ, 80гб SSD

Проект - Laravel, nodeJS, Centrifuge, MySQL (все таблицы InnoDB), реал тайм приложение, в БД индексы проставлены, БД нормализована, больше всего запросов по SELECT, но Update, Insert, Delete тоже есть, однако селектов существенно больше, кроме того, их вызывают не только пользователи, они вызываются всегда в фоновом режиме самим приложением.

Проблема - при большом наплыве онлайна (700+), начинает виснуть всё, CPU машины уходит в 70+% загрузки и база не отвечает какое-то время.

Вопрос - что можно сделать с конфигурацией mySQL? Мы вообще не трогали конфиг, кроме как InnoDB Buffer Pool выставили на ~80% от ОЗУ, судя по рекомендациям гайдов, в остальном ничего не трогали особо. Кто что может подсказать? Если что, можно связаться лично, за помощь вознаграждение!
  • Вопрос задан
  • 282 просмотра
Решения вопроса 1
@Mrk0tA Автор вопроса
Вопрос закрыт, проблема была в конфигурации MySQL, как я и предполагал, а не в индексах, или построении запросов.
Изменили под наш конфиг машины данные параметры MySQL:
1) max_allowed_packet увеличили (до 64мб)
2) key_buffer_size увеличен (до 64мб)
3) innodb_buffer_pool_size значительно уменьшен (до 4гб)
4) max_connections значительно увеличены (до 10000)
5) query_cache_size увеличен (до 16мб)
А также добавили и включили файл подкачки, но он пока не задействован, т.е конфиг сделал главное дело.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@dimuska139
Backend developer
  1. Включить логирование медленных запросов MySQL, после чего оптимизировать, добавить индексы.
  2. Обратить внимание на то, что индексы могут приводить и к падению производительности, так что неиспользуемые лучше удалять.
  3. Убедиться, что не просто индексы проставлены, а проставлены правильно.
  4. Включить логирование atop на несколько дней, чтобы была возможность понаблюдать, что происходить в системе, когда "начинает виснуть всё". Может быть, вообще не в MySQL дело?
  5. В Laravel запросы делаются к базе с помощью Active Record - бывает так, что вместо JOIN в базу летит гора запросов циклом - это не оптимально.
  6. Как уже выше писали, нужно использовать кеширование - это ощутимо снизит нагрузку.
Ответ написан
Комментировать
dimonchik2013
@dimonchik2013
non progredi est regredi
0) mysql tuner что говорит?
1) 80гб SSD при 64 памяти, эт че за сервер такой? ВПС , докер?
Ответ написан
solotony
@solotony
покоряю пик Балмера
какой ресурс уходит ? если только CPU - то с уверенностью 99% можно сказать что это проблема отсутствия индексов, в частности выполнение операций над join-ами без индексов или вообще не индексируемых операция в запросах. подход один - поиск тяжелых запросов и их оптимизация.

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

Войдите, чтобы написать ответ

Похожие вопросы