#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.
Комментариев нет:
Отправить комментарий