Skocz do zawartości

Optymalizacja dużego zapytania SQL


pikey

Rekomendowane odpowiedzi

Witam serdecznie,

Zrobiłem dość potężne zapytanie do mojej bazy danych MySQL:

SELECT SQL_CALC_FOUND_ROWS `products_stock`.`products_id`,`products_stock`.`products_stock_attributes`,`products_stock`.`products_stock_quantity`,`products`.`manufacturers_id`,`products_description`.`products_name`
  FROM  `products_stock`
 LEFT JOIN  `products` ON  `products_stock`.`products_id` =  `products`.`products_id`
 LEFT JOIN  `products_description` ON  `products_stock`.`products_id` =  `products_description`.`products_id`
 LEFT JOIN `products_to_categories` ON `products_stock`.`products_id` = `products_to_categories`.`products_id`

 WHERE `products_stock`.`products_stock_quantity` >=3 AND `products`.`products_status` = 1
 AND ISNULL(`products`.`products_image`) = false AND `products`.`products_image` != ""

 AND EXISTS(

  select * from `allegro` where `products_stock`.`products_id` = `allegro`.`product_id`
  and `allegro`.`attributes` =  `products_stock`.`products_stock_attributes`

 ) = false

Zapytanie to pobiera dane o produktach, których ilośc >=3, które nie mają zdjęcia i których ID nie znajduje się w tabeli `allegro`.

Tabela `products` posiada około 14k rekordów, tabela `allegro` na tę chwilę około 3k rekordów.

Zapytanie jest nieco wolne, wykonuje się średnio 10 sekund...

Proszę o pomoc i wskazówki, jak mogę zoptymalizować to zapytanie :)

Pozdrawiam

Odnośnik do komentarza
Udostępnij na innych stronach

@Proszę o pomoc i wskazówki, jak mogę zoptymalizować to zapytanie

Zainteresuj się https://dev.mysql.com/doc/refman/5.0/en/explain.html MySQL sam "powie czego potrzebuje lub co mu nie pasuje" < analizę wyników z Explain> pozostawiam już tobie..

oraz wdrożeniem cache danych.

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Po pierwsze - jeżeli nie musisz używać LEFT JOINA to zmień go na STRAIGHT JOINA, natomiast podzapytanie do tabeli allegro to powinien być LEFT JOIN.

Na szybko:



SELECT SQL_CALC_FOUND_ROWS `products_stock`.`products_id`,`products_stock`.`products_stock_attributes`,`products_stock`.`products_stock_quantity`,`products`.`manufacturers_id`,`products_description`.`products_name`
FROM (`products_stock`, `products`, `products_description`, `products_to_categories`)
LEFT JOIN `allegro` ON `products_stock`.`products_id` = `allegro`.`product_id` AND `allegro`.`attributes` = `products_stock`.`products_stock_attributes`
WHERE `products_stock`.`products_id` = `products`.`products_id`
AND `products_stock`.`products_id` = `products_description`.`products_id`
AND `products_stock`.`products_id` = `products_to_categories`.`products_id`
AND `products_stock`.`products_stock_quantity` >=3 AND `products`.`products_status` = 1
AND `products`.`products_image` IS NOT NULL AND `products`.`products_image` != ""
AND `allegro`.`product_id` IS NULL

Przy tak małej ilości rekordów, powinieneś tak zoptymalizować strukturę i zapytanie SQL aby wykonywało się w około 1/100 sekundy a nie 10 sekund.

Odnośnik do komentarza
Udostępnij na innych stronach

Tylko jak już będziesz testował różne warianty zapytania proponuję rób to z wyłączonym cache SQL_NO_CACHE

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności