Гипероптимизация, когда она бывает нужна?

Гипероптимизация, когда она бывает нужна?

Век живи, век учись. Вот бывает сделаешь-настроишь магазин, все быстро, все хорошо, а добавят 10-20 к товаров и система нагибается.

Обратился на днях, давний товарищ. Все у него хорошо работает, но batch_editor при холодном старте запирает магазин на 2-3 минуты, при этом, если на магазине большой трафик, сервер базы падает, якобы потому что заканчивается память. Саппорт хостинга ничем не может помочь, кроме как советом — добавить еще памяти.

При ближайшем осмотре вылезли очень длинные тугие запросы, которые формировали полный набор данных на 500 товаров (по 500 товаров на страницу стояли лимиты и так зачем-то надо). Начинаем смотреть подробней что можно сделать…

В таих ситуациях, когда лочится таблица — крайне желательно перевести все на innodb, чтобы таблицы лочились на уровне записей а не таблиц. Сказано сделано, да все не просто. В магазине стоит MegaFilterPro, а он использует fulltext индексы, а их innodb не поддерживает. Но  с версии 10 mariadb и с версии 5.7 mysql поддерживают.
Ладно.  Надо поставить mariadb 10. Но у нас на сервере колхоз-колхозный и куча других сайтов, а в мои планы никак не входило переустанавливать сервер и разворачивать из бекапов десяток магазинов  в новом окружении.
Docker в зубы, запускаем последний стабильный образ maridab, даем немного воздуха серверу базы, путем увеличения размера буфферов, не забываем научить работать phpmyadmin со вторым сервером, добавляем в автозагрузку наш контейнер и переносим туда только рабочую базу.

Иииии магазин перестал лочится, но батч все равно медленный.
Что делать ?

Начинаем отслеживаем медленные запросы, находим какую то дурь типа:

LEFT JOIN url_alias ua ON (ua.query = CONCAT(‘product_id=’, p.product_id))  WHERE p.product_id  GROUP BY p.product_id

Немного шаманим с индексами и… все оживает. 500 товаров в батче открываются меньше чем за секунду.

batch_ed

 

Нужно отметить, что, если бы мы использовали mysql-сервер вместо mariadb, подобного прироста получить бы не удалось, так как в силу специфики, мария намного быстрее работает с подобного рода подзапросами, из-за которого и был основной тормоз.

На последок вкручиваем nginx + php-fpm, включаем http2, включаем opcache, и магазин не узнать. За какие-то пару часов, без расширения ресурсов сервера, без боданий с саппортом, получаем нормальную работу системы.

 

Хуйнаныр(11)Очко(1)

Запостить высер

2 Высеров на "Гипероптимизация, когда она бывает нужна?"

Стучать мне на мыло
avatar

Сортировать:   Свежие | Тухлые | Хуйнанырные
kabantejay
робот-вертер
kabantejay
23 дней 16 часов назад

подскажите, а как докер поставить на автозагрузку? ну и чтоб мониторинг типа работал, пашет альтернативная версия или нет, у меня тоже впс на isp. не могу нигде найти. спасибо

wpDiscuz