Помощь Оптимизиция некоторых запросов к БД

ihos

Участник
Регистрация
13 Май 2012
Сообщения
213
Реакции
3
Возникла проблема. Есть интернет магазина на опенкарт 2 с 10000 позиций товара.
Начал рости трафик, в день 800-1000 людей и тут начались трали-вали. То ошибка 503 начала проявлятся и хост ругается на нагрузкe на MySQL сервер. Для просмотра ссылки Войди или Зарегистрируйся
Я уже пробывал модули модуль, модификаторы отключать по очереди, но что то никак. Отключил подсчет в модуле категории.
Протестировал скорость запросов к БД вот самые долгие:

Источник:/home/site/www/vqmod/vqcache/vq2-system_storage_modification_catalog_model_catalog_product.php
Время выполнения: 259.46мс

SELECT * FROM oc_product_to_category p2c LEFT JOIN oc_product p ON (p2c.product_id = p.product_id) LEFT JOIN oc_product_to_store p2s ON (p.product_id = p2s.product_id) WHERE p2c.category_id IN (SELECT category_id FROM oc_product_to_category WHERE product_id = '12182') AND p.product_id != '12182' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '0' ORDER BY RAND() LIMIT 0,6

----------------------

Источник:/home/site/www/vqmod/vqcache/vq2-system_storage_modification_catalog_model_catalog_product.php
Время выполнения: 319.66мс

SELECT p.product_id, (SELECT AVG(rating) AS total FROM oc_review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT price FROM oc_product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '1' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT ((p.price - ps.price) / (p.price / 100)) FROM oc_product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '1' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special_percent, (SELECT price FROM oc_product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '1' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special FROM oc_product_to_category p2c LEFT JOIN oc_product p ON (p2c.product_id = p.product_id) LEFT JOIN oc_product_description pd ON (p.product_id = pd.product_id) LEFT JOIN oc_product_to_store p2s ON (p.product_id = p2s.product_id) WHERE pd.language_id = '2' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '0' AND p2c.category_id = '303' GROUP BY p.product_id ORDER BY p.price = 0, p.quantity = 0, p.sort_order ASC, LCASE(pd.name) ASC LIMIT 0,20

----------------------

Источник:/home/site/www/catalog/controller/common/seo_url.php
Время выполнения: 403.01мс

SELECT * FROM oc_url_alias WHERE `query` = 'category_id=503'

----------------------

Это самые жирные по времени.
Стоят модули
Кеширование – v2pagecache
Модуль СЕО – Complete SEO Package
Фильтр - Mega Filter PRO
 
Эти запросы пол беды. Нагрузку может давать еще их кол-во. Нужно индексы проставлять, и чем то пожертвовать, потому что ORDER BY RAND() это ТБМ.
 
подскажите пожалуйста как на хостинге посмотреть какие запросы последние по бд были, после ввода на сайте в окно поиска сайт на глухо ложится, подсчет в категориях галочку убрал, или может кто сталкивался с проблемой с поиском, 10к товаров, после ввода сайт висит минуту-2
 
Запрос из oc_url_alias 403.01мс это слишком. Индексы вообще есть? Посмотрите нагрузку на mysql. Саму таблицу проверьте, может фрагментация сильная или место на хостинге заканчивается. Вариантов много
В любом случае такое поведение ненормальное
 
Назад
Сверху