Jump to content
  • 0

Jak długo wykonuje się wam to zapytanie SQL - testy i dyskusja optymalizacji :)


hakeryk2

Question

Witam,

 

Mam ostatnio pewną zagwozdkę której nie mogę rozwiązać i chciałbym byście wpadli do PHPMyAdmina, wybrali swoją bazę i w zakładce SQL odpalili tę komendę i podzieli się wynikiem w jakim czasie została ona zrealizowana.

 

Nie obawiajcie się, jest to komenda wyświetlająca ostatnie 200 zamówień z produktami które zostały zakupione.

Po wyświetleniu wyników u góry pojawi się napis Pokazano wiersze 0 - 199 (200 ogółem, Wykonanie zapytania trwało 0.1940 sekund(y).)  -

 

SELECT SQL_NO_CACHE SQL_CALC_FOUND_ROWS
  a.`id_order`,  `total_paid_tax_incl`,  `payment`,  `tracking_number`,  a.`date_add` AS `date_add`,
  `current_state`,  a.id_currency,  CONCAT(c.`firstname`, '  ', c.`lastname`) AS `customer`,  osl.`name` AS `osname`,
  os.`color`,
  (
  SELECT
    LEFT(
      GROUP_CONCAT(
        odd.product_name SEPARATOR " || "
      ),
      105
    )
  FROM
    `ps_order_detail` odd
  WHERE
    odd.id_order = a.id_order
) AS products,
IF(
  (
  SELECT
    so.id_order
  FROM
    `ps_orders` so
  WHERE
    so.id_customer = a.id_customer AND so.id_order < a.id_order
  LIMIT 1
) > 0,
0,
1
) AS NEW, country_lang.name AS cname, IF(a.valid, 1, 0) badge_success
FROM
  `ps_orders` a
LEFT JOIN
  `ps_order_carrier` oc
ON
  a.`id_order` = oc.`id_order`
LEFT JOIN
  `ps_customer` c
ON
  (c.`id_customer` = a.`id_customer`)
INNER JOIN
  `ps_address` address
ON
  address.id_address = a.id_address_delivery
INNER JOIN
  `ps_country` country
ON
  address.id_country = country.id_country
INNER JOIN
  `ps_country_lang` country_lang
ON
  (
    country.`id_country` = country_lang.`id_country` AND country_lang.`id_lang` = 1
  )
LEFT JOIN
  `ps_order_state` os
ON
  (
    os.`id_order_state` = a.`current_state`
  )
LEFT JOIN
  `ps_order_state_lang` osl
ON
  (
    os.`id_order_state` = osl.`id_order_state` AND osl.`id_lang` = 1
  )
WHERE
  1
ORDER BY
  a.`id_order`
DESC
LIMIT 0, 200

 

Dlaczego pytam? Otóż na localhoście to konkretne zapytanie jest całkiem szybkie, natomiast na produkcji zajmuje około 3-4 sekundy pomimo tej samej konfiguracji ustawień bazy danych. Różncia jest tylko w procesorze i chciałbym się dowiedzieć czy tylko u mnie takie zapytanie wykonuje się powoli.

 

Ogólnie inne zapytania np wyświetlenie listy produktów wykonują się podobnie czasowo localhost vs produkcja, localhost jest szybszy może x2, ale akurat w powyższym zapytaniu różnica jest po prostu kolosalna. No chyba, że może ktoś wie jak to zapytanie zoptymalizować.

EDYCJA

 

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

 

Znalazłem rozwiązanie swojego problemu w trakcie zakładania tego tematu. W moim zapytaniu którego tutaj nie zamieściłem znajdował się dodatkowo LEFT JOIN którego nie zawarłem specjalnie ponieważ odwoływał się do kolumn innego modułu. Podmiana na zwykły JOIN wystarczyłby zoptymalizować zapytanie do grubo poniżej sekundy :)

Edited by hakeryk2 (see edit history)
Link to comment
Share on other sites

2 answers to this question

Recommended Posts

  • 0

Dzięki endriu, ale problem rozwiązałem jak wspomniałem w edit. Ot użyłem jeszcze dodatkowe joina który korzystałem z wartości która nie posiadała indeksu i całe zapytanie było ociążałe. Dziwi mnie tylko dlaczego nawet ociążałe rozwiązanie localhost wykonywał szybko, a VPS się tak ociągał.

 

Czyżby i5 4790k był aż tyle szybszy od Xeona 2.4 Ghz?

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...