Падает база - подсобите советом (Opencart)

L
На сайте с 16.10.2014
Offline
108
905

Доброго времени..

Долго мучаюсь с хотсерами по скорости моего сайта, последние что они мне показали , это запросы которые гробят базу. (время от времени выпадает 504 ошибка )

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

# Query_time: 74.790640 Lock_time: 0.000149 Rows_sent: 10 Rows_examined:
72863490
SELECT p.product_id, (SELECT AVG(rating) AS total FROM oym_review r1 WHERE
r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS
rati
ng, (SELECT price FROM oym_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.da
te_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, (SELECT COUNT(*)
AS
total FROM oym_order_product op LEFT JOIN `oym_order` o ON (op.order_id =
o.order_id) WHERE o.order_status_id > '0' AND op.product_id = p.product_id
GROUP
BY op.product_id) as topsellers FROM oym_product p LEFT JOIN
oym_product_description pd ON (p.product_id = pd.product_id) LEFT JOIN
oym_product_to_store p2
s ON (p.product_id = p2s.product_id) WHERE pd.language_id = '1' AND p.status =
'1' AND p.date_available <= NOW() AND p2s.store_id = '0' GROUP BY p.product_
id ORDER BY p.date_added DESC LIMIT 10;

# Query_time: 145.558326 Lock_time: 66.791127 Rows_sent: 10 Rows_examined:
72863490
SELECT p.product_id, (SELECT AVG(rating) AS total FROM oym_review r1 WHERE
r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS
rati
ng, (SELECT price FROM oym_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.da
te_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, (SELECT COUNT(*)
AS
total FROM oym_order_product op LEFT JOIN `oym_order` o ON (op.order_id =
o.order_id) WHERE o.order_status_id > '0' AND op.product_id = p.product_id
GROUP
BY op.product_id) as topsellers FROM oym_product p LEFT JOIN
oym_product_description pd ON (p.product_id = pd.product_id) LEFT JOIN
oym_product_to_store p2
s ON (p.product_id = p2s.product_id) WHERE pd.language_id = '1' AND p.status =
'1' AND p.date_available <= NOW() AND p2s.store_id = '0' GROUP BY p.product_
id ORDER BY p.date_added DESC LIMIT 10;

# Query_time: 72.412323 Lock_time: 6.867669 Rows_sent: 10 Rows_examined:
72863490
SELECT p.product_id, (SELECT AVG(rating) AS total FROM oym_review r1 WHERE
r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS
rati
ng, (SELECT price FROM oym_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.da
te_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, (SELECT COUNT(*)
AS
total FROM oym_order_product op LEFT JOIN `oym_order` o ON (op.order_id =
o.order_id) WHERE o.order_status_id > '0' AND op.product_id = p.product_id
GROUP
BY op.product_id) as topsellers FROM oym_product p LEFT JOIN
oym_product_description pd ON (p.product_id = pd.product_id) LEFT JOIN
oym_product_to_store p2
s ON (p.product_id = p2s.product_id) WHERE pd.language_id = '1' AND p.status =
'1' AND p.date_available <= NOW() AND p2s.store_id = '0' GROUP BY p.product_
id ORDER BY p.date_added DESC LIMIT 10;

# Query_time: 128.729961 Lock_time: 63.209647 Rows_sent: 10 Rows_examined:
72844697
use shopauto_db;
SELECT p.product_id, (SELECT AVG(rating) AS total FROM oym_review r1 WHERE
r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS
rati
ng, (SELECT price FROM oym_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.da
te_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, (SELECT COUNT(*)
AS
total FROM oym_order_product op LEFT JOIN `oym_order` o ON (op.order_id =
o.order_id) WHERE o.order_status_id > '0' AND op.product_id = p.product_id
GROUP
BY op.product_id) as topsellers FROM oym_product p LEFT JOIN
oym_product_description pd ON (p.product_id = pd.product_id) LEFT JOIN
oym_product_to_store p2
s ON (p.product_id = p2s.product_id) WHERE pd.language_id = '1' AND p.status =
'1' AND p.date_available <= NOW() AND p2s.store_id = '0' GROUP BY p.product_
id ORDER BY p.viewed DESC LIMIT 10;
Купить автомобиль из США можно тут (https://us-car.com.ua)
L
На сайте с 10.02.2015
Offline
178
#1

Выполните такие же запросы, тольки впереди используйте EXPLAIN.

Дальше читать и думать по его результатам.

Возможно, нужно добавить индексы.

Какой размер базы?

Кеширование mysql используете?

Тогда нужно избавиться от NOW() в запросах.

Запросы идут через АПИ или написаны вручную?

Нагрузку на БД может снять кеширование (memcached / файлы)

---------- Добавлено 07.04.2016 в 14:37 ----------

Ну и можно изменить логику работы, но хз писался код вами или это код ядра.

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

L
На сайте с 16.10.2014
Offline
108
#2
livetv:
Выполните такие же запросы, тольки впереди используйте EXPLAIN.

Дальше читать и думать по его результатам.

Возможно, нужно добавить индексы.

Какой размер базы?

Кеширование mysql используете?
Тогда нужно избавиться от NOW() в запросах.

Запросы идут через АПИ или написаны вручную?

Нагрузку на БД может снять кеширование (memcached / файлы)

---------- Добавлено 07.04.2016 в 14:37 ----------

Ну и можно изменить логику работы, но хз писался код вами или это код ядра.
Например, не считать каждый раз срелний рейтинг товара, а раз в день обновлять его.

Спасибо ! пошел курить )

Ragnarok
На сайте с 25.06.2010
Offline
226
#3

lexter, слышал про такую проблему у OC.. попробуйте погуглить что-то по оптимизации запросов Opencart, типа этого

//TODO: перестать откладывать на потом
L
На сайте с 16.10.2014
Offline
108
#4
Ragnarok:
lexter, слышал про такую проблему у OC.. попробуйте погуглить что-то по оптимизации запросов Opencart, типа этого

спасибо , похоже на мою проблему !

C
На сайте с 04.02.2005
Offline
275
#5

та нет там проблемы..

Там проблема, в том что используется подзапрос

в частности вот этот

(SELECT COUNT(*)
AS
total FROM oym_order_product op LEFT JOIN `oym_order` o ON (op.order_id =
o.order_id) WHERE o.order_status_id > '0' AND op.product_id = p.product_id
GROUP
BY op.product_id) as topsellers

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий