Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

кусок SQL и запрос на 3.3 сек


Recommended Posts

Есть вот такой вот кусок запроса

p.quantity > 0 as nalichie


который реплейсится вот таким

SELECT GREATEST(p.quantity, COALESCE((SELECT max(p1.quantity) FROM " . DB_PREFIX . "product p1 WHERE p1.product_id IN (SELECT pl.product_id FROM hpmodel_links pl WHERE pl.parent_id = p.product_id)), 0))) > 0 as nalichie

на выходе..

		$sql = "SELECT DISTINCT ps.product_id, p.price, (SELECT GREATEST(p.quantity, COALESCE((SELECT max(p1.quantity) FROM " . DB_PREFIX . "product p1 WHERE p1.product_id IN (SELECT pl.product_id FROM hpmodel_links pl WHERE pl.parent_id = p.product_id)), 0))) > 0 as nalichie, p.price > 0 as nalichie2, (SELECT AVG(rating) FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = ps.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating FROM " . DB_PREFIX . "product_special ps LEFT JOIN " . DB_PREFIX . "product p ON (ps.product_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " . DB_PREFIX . "hpmodel_product_hidden kph ON (p.product_id = kph.pid) WHERE kph.pid IS NULL AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ps.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) GROUP BY ps.product_id";


но.. в итоге получаем 4,2сек..

у кого какие идеи..?
 

3.209 сек.
SELECT p.product_id, p.price, 
(SELECT GREATEST(p.quantity, COALESCE((SELECT max(p1.quantity) 
FROM product p1 
WHERE
   p1.product_id IN (SELECT pl.product_id 
FROM hpmodel_links pl 
WHERE
   pl.parent_id = p.product_id)), 0))) > 0 as nalichie, p.price > 0 as nalichie2, (SELECT AVG(rating)
 AS total 
FROM review r1 
WHERE
   r1.product_id = p.product_id AND
   r1.status = '1' 
GROUP BY r1.product_id) AS rating, 
(SELECT price 
FROM 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 price 
FROM 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 product_to_category p2c 
LEFT JOIN product p ON (p2c.product_id = p.product_id) 
LEFT JOIN product_description pd ON (p.product_id = pd.product_id) 
LEFT JOIN product_to_store p2s ON (p.product_id = p2s.product_id) 
LEFT JOIN hpmodel_product_hidden kph ON (p.product_id = kph.pid) 
WHERE
   kph.pid IS NULL AND
   pd.language_id = '1' AND
   p.status = '1' AND
   p.date_available <= NOW() AND
   p2s.store_id = '0' AND
   p2c.category_id = '93' AND
   (p.stock_status_id <> 9) OR (p.quantity > 0 AND
   p.stock_status_id = 9) 
GROUP BY p.product_id 
ORDER BY nalichie2 DESC, p.sort_order ASC, LCASE(pd.name) ASC 
LIMIT 0,24

 

Надіслати
Поділитися на інших сайтах


  • Кеш
  • Денормализация если сильно дает по производительности и рационально, вынос в отдельную таблицу сумм сложного вычисления, количество отзывов и тому подобное (учесть что может быть не совместимость с другими модулями или соблюсти актуализацию данных) 
  • Перепроверить индексы 
  • Учесть что индексы не работают на сортировке плана и создается временная таблица
ORDER BY nalichie2 DESC, p.sort_order ASC, LCASE(pd.name) ASC 
  • Дробить запрос на мелкие блоки, не всегда нам нужны в запросе например отзывы
  • Не использовать GROUP BY r1.product_id  без сортировки, GROUP BY  r1.product_id ORDER BY NULL, только до версии mySQL 8 в 8 это профиксили 

  • Конфиги базы

  • +1 1
Надіслати
Поділитися на інших сайтах

У товара есть поле сортировки
куда прёт запрос..
и есть дочерние товары...

по сути у поля сортировка, нам нужно 0(это по умолчанию) и -1 если наличия = 0

т.е. запрос шурует по всем товарам..
а если мы сделаем не большой модификатор который берёт конкретный товар родитель - смотрит по id что к нему привязано в дочерних.
если = 0 все вместе с родителем
передаем в поле сортира -1
если чего то в наличии больше 0 то ничего не делаем т.к. там по умолчанию в сортировке 0

в итоге - запрос к БД не нужен

и дергать его по какому нить событию чтоб было актуально

 

Надіслати
Поділитися на інших сайтах


Короче заменили в запросе qty  на другое поле jan
терь задача в jan писать 1 или 0 по какому нить событию
исходя из наличия родителя с дочерними товарами (своя таблица связей)
+ есть товары без дочерних
..надо думать че как..

а запросы  на свалку

 

Надіслати
Поділитися на інших сайтах


Только что, freelancer сказал:

 

такие как в первом после да ) там им самое место )

 

да там писец почти 5сек страница загружается..))
а ща

общее время запросов: 0.342 сек.

.....
вот ша надо думать как другой вариант реализовать.. с минимумом шевелений

Надіслати
Поділитися на інших сайтах


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

Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.