2015-10-20 8 views
5

私は「上司」でグループ化された場合は約52秒を取っている次のクエリを使用していますそれ以外の場合は2〜3秒以内に完了します。"group by"句を使ってmysqlでクエリを最適化する方法は?

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 

時間の量ができるように、これを最適化する方法上の任意の提案減らされる?

+0

このクエリが無効である、この説明を見て:その代わり条件YEAR(o.sale_on) =2015使用条件のhttp://stackoverflow.com/a/33221376/447489 – fancyPants

+0

どのように私はあなたの説明からそれを取得できませんでしたクエリが無効ですか?ここで説明していただけますか? –

+0

'supervisor'でグループ化しますが' sale_on'を選択します。それは一致しません。あなたのクエリをすぐに読み込むことを停止しましたが、サブクエリも非常に奇妙に見えます。それらは従属サブクエリであり、結果の各行に対して実行されます。あなたの質問が遅いのは不思議ではありませんジョインで書き直し、 'explain select ...'出力を追加し、 'create table'文を表示します。私は実際にあなたがどのようにこの質問に5 upvotesを持っているのだろうか。 – fancyPants

答えて

0

潜在的な索引ヘルプの恩恵を受けることができなかったため、where条件で日付関数を使用しないでください。

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

私は交換しましたが運はありません。それでも52秒以上かかる。 o.sale_onでグループを使用するとうまく動作します –

関連する問題