2015-10-20 21 views
5

używam następującą kwerendę, która bierze około 52 sekund, jeśli pogrupowane według „nadzorcy” w przeciwnym razie kończy w ciągu 2 lub 3 sekundy:Jak zoptymalizować zapytanie w mysql przy użyciu klauzuli "grupuj według"?

SELECT SQL_CALC_FOUND_ROWS MONTHNAME(o.sale_on) AS DATE, 
     SUM(od.current_status_id=1) AS sales, 
     IFNULL(SUM(CASE WHEN od.current_status_id=2 
        OR od.current_status_id=3 THEN 
        (SELECT SUM(amount) 
        FROM order_refund_chargeback 
        WHERE order_detail_id = od.order_detail_id) END),0) AS total_outflow, 
     IFNULL(
       (SELECT GROUP_CONCAT(CONCAT(user_first_name," ",user_last_name)) 
       FROM user_detail 
       WHERE user_id IN 
        (SELECT manager_id 
        FROM `user_org_map` 
        WHERE user_id = o.assigned_to)),"") AS supervisor, 
     IFNULL(mco.country_name,"") AS country 
FROM orders o 
RIGHT JOIN order_detail od 
    USING (order_id) 
LEFT JOIN user_detail ud 
    ON ud.user_id = o.assigned_to 
LEFT JOIN customer_detail cd 
    ON cd.customer_id= o.customer_id 
LEFT JOIN master_product mp 
    ON mp.product_id = od.product_id 
LEFT JOIN master_campaign mc 
    ON mc.campaign_id = cd.campaign_id 
LEFT JOIN master_country mco 
    ON mco.country_id = cd.country 
WHERE 1=1 
AND YEAR(o.sale_on) =2015 
GROUP BY supervisor 
ORDER BY supervisor ASC 
LIMIT 0, 12 

Wszelkie sugestie, w jaki sposób zoptymalizować to tak, że ilość czasu może być zredukowanym?

+0

To zapytanie jest nieważny, rzucić okiem na to wyjaśnienie: http://stackoverflow.com/a/33221376/447489 – fancyPants

+0

nie dostać, że z wyjaśnieniem, w jaki sposób zapytanie jest nieprawidłowe? czy możesz wyjaśnić tutaj? –

+0

Grupujesz według 'superwizora', ale wybierasz' wyprzedaż_na'. To nie pasuje. Zatrzymałem czytanie zapytania tam, ale twoje podkwerendy również wydają się bardzo dziwne. Są to zależne podzapytania, wykonywane dla każdego wiersza w wyniku. Nic dziwnego, że twoje zapytanie jest wolne. Przepisz go za pomocą sprzężeń, dodaj dane wyjściowe 'explain select ...', pokaż instrukcje 'create table' i tak dalej, jeśli chcesz je zoptymalizować. Zastanawiam się, w jaki sposób zdobyliście 5 przegranych na to pytanie. – fancyPants

Odpowiedz

0

Nie używaj funkcji daty w warunku, w którym nie można skorzystać z pomocy indeksu. Zamiast stan YEAR(o.sale_on) =2015 stosowania warunku:

o.sale_on BETWEEN '2015-01-01' AND '2015-12-31'. 
+0

Wymieniłem, ale bez powodzenia. Nadal trwa 52+ sekund. Działa to dobrze, jeśli używam -> group by o.sale_on –

Powiązane problemy