2015-10-20 10 views
5

Sto usando la seguente query che sta prendendo circa 52 secondi se raggruppati per 'supervisore' altrimenti si completa entro 2 o 3 secondi:Come ottimizzare una query in mysql mentre si utilizza la clausola "group by"?

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 

Qualsiasi suggerimento su come ottimizzare questo modo che la quantità di tempo può essere ridotto?

+0

Questa query non è valido, dare un'occhiata a questa spiegazione: http://stackoverflow.com/a/33221376/447489 – fancyPants

+0

Non ho ottenuto che dal tua spiegazione come il la query non è valida? puoi spiegare qui? –

+0

Si raggruppa per 'supervisor' ma si seleziona' sale_on'. Non corrisponde. Smesso di leggere la tua query proprio lì, ma anche le subquery sembrano molto strane. Quelle sono sottoquery dipendenti, eseguite per ogni riga del risultato. Nessuna meraviglia che la tua richiesta sia lenta. Riscritelo con i join, aggiungete un output 'explain select ...', mostrate le istruzioni 'create table' e così via se volete ottimizzarlo. Mi chiedo davvero come hai ottenuto 5 voti positivi su questa domanda. – fancyPants

risposta

0

Non utilizzare la funzione data nella condizione where perché non è possibile usufruire della guida dell'indice. Invece del Condition YEAR(o.sale_on) =2015 uso:

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

Ho sostituito, ma senza fortuna. Ancora prendendo 52+ sec. Funziona bene se uso -> group by o.sale_on –

Problemi correlati