Страницы

Поиск по вопросам

вторник, 17 декабря 2019 г.

Как уменьшить нагрузку на базу данных?

#mysql #оптимизация


Занимаюсь разработкой и поддержкой движка на Laravel для сервиса  партнерских программ.
Текущий трафик, который идёт на сервер порядка 30 миллионов посещений в сутки. К базе
постоянно идёт ~1500 запросов в секунду. Это нормально и сервер с этим справляется
отлично, но как только количество запросов возрастает до 6000 в секунду, сервер начинает
откровенно подвисать. 

В связи со сложившейся ситуацией возник вопрос, а как вообще можно разгрузить базу?
СУБД MySQL, таблицы на InnoDB. Движок написан на Laravel.

Вообще количество запросов сократить не получается, т.к. фиксируется каждое посещение
и посетитель закрепляется за партнёром. При этом все данные пишутся в БД, но сначала
извлекаются и проверяются по некоторым параметрам.

Таблицы проиндексированы. Также используется CloudFlare.
    


Ответы

Ответ 1



В плане железа использовать горизонтальное или вертикальное масштабирование. Но в вашем случае конечно лучше использовать горизонтальное, в реализации сложнее - но потом проще масштабировать. В плане кода: Если у вас много JOIN в запросах. Опишу на примере: Есть таблица leads, и вспомогательные leads_attrs, leads_params, leads_times и т.д. Многие создают метод получения лидов сразу со всеми параметрами и далее используют его по всему проекту. Но можно пересмотреть все места использования и проверить, везде ли требуется подключение всех вспомогательных таблиц leads_attrs, leads_params, leads_times? Количество выгружаемых данных по запросам. Если есть к примеру таблица users, в которой присутствует 25 таблиц. Обычным SELECT * FROM users WHERE 1 вы будете получать огромное количество данных. В таких местах требуется проверить, все ли данные требуются? Обычно требуется 3-5 параметров, остальные тянутся тяжелой ношей. И самое главное кеширование. В PHP фреймворках реализовано хорошее кеширование из коробки, его стоит использовать. Только в случае с кешированием главное не "переборщить". Требуется кешировать общие данные, которые чаще всего повторяются. Пример: на сайте есть таблица городов, которая каждый раз выгружается из базы, весь список городов лучше закешировать и каждый раз брать из кеша - нежели на каждой странице дёргать sql.

Комментариев нет:

Отправить комментарий