2016-10-09 6 views
0

を結ぶ左スロークエリのパフォーマンスは、私は2つのテーブルを持っているビュー

SELECT sub1.fecha, COUNT(idconsumo) as consumo 
FROM `last_30_days` `sub1` 
LEFT JOIN `CONSUMO` ON sub1.fecha = DATE_FORMAT(fechahora, "%M %e") 
LEFT JOIN `CONTRATADO` ON CONSUMO.idkey = CONTRATADO.idkey 
WHERE idusuario IS NULL OR idusuario = 1 
GROUP BY `sub1`.`fecha` 
ORDER BY `sub1`.`fecha_order` 

かなりの時間(約20秒)がかかります。ここで

クエリで説明されています

id  select_type  table         type possible_keys key  key_len ref      rows Extra 
1  PRIMARY   <derived3>        ALL  NULL   NULL NULL NULL     10  "Using temporary; Using filesort" 
1  PRIMARY   <derived13>        ALL  NULL   NULL NULL NULL     10  "Using join buffer" 
1  PRIMARY   <derived23>        ALL  NULL   NULL NULL NULL     10  "Using where; Using join buffer" 
1  PRIMARY   CONSUMO         ALL  NULL   NULL NULL NULL     908553 
1  PRIMARY   CONTRATADO        eq_ref PRIMARY   PRIMARY 4  c1geoapi.CONSUMO.idkey 1  "Using where" 
23  DERIVED   NULL         NULL NULL   NULL NULL NULL     NULL "No tables used" 
24  UNION   NULL         NULL NULL   NULL NULL NULL     NULL "No tables used" 
25  UNION   NULL         NULL NULL   NULL NULL NULL     NULL "No tables used" 
26  UNION   NULL         NULL NULL   NULL NULL NULL     NULL "No tables used" 
27  UNION   NULL         NULL NULL   NULL NULL NULL     NULL "No tables used" 
28  UNION   NULL         NULL NULL   NULL NULL NULL     NULL "No tables used" 
29  UNION   NULL         NULL NULL   NULL NULL NULL     NULL "No tables used" 
30  UNION   NULL         NULL NULL   NULL NULL NULL     NULL "No tables used" 
31  UNION   NULL         NULL NULL   NULL NULL NULL     NULL "No tables used" 
32  UNION   NULL         NULL NULL   NULL NULL NULL     NULL "No tables used" 
NULL "UNION RESULT" <union23,24,25,26,27,28,29,30,31,32> ALL  NULL   NULL NULL NULL     NULL  
13  DERIVED   NULL         NULL NULL   NULL NULL NULL     NULL "No tables used" 
14  UNION   NULL         NULL NULL   NULL NULL NULL     NULL "No tables used" 
15  UNION   NULL         NULL NULL   NULL NULL NULL     NULL "No tables used" 
16  UNION   NULL         NULL NULL   NULL NULL NULL     NULL "No tables used" 
17  UNION   NULL         NULL NULL   NULL NULL NULL     NULL "No tables used" 
18  UNION   NULL         NULL NULL   NULL NULL NULL     NULL "No tables used" 
19  UNION   NULL         NULL NULL   NULL NULL NULL     NULL "No tables used" 
20  UNION   NULL         NULL NULL   NULL NULL NULL     NULL "No tables used" 
21  UNION   NULL         NULL NULL   NULL NULL NULL     NULL "No tables used" 
22  UNION   NULL         NULL NULL   NULL NULL NULL     NULL "No tables used" 
NULL "UNION RESULT" <union13,14,15,16,17,18,19,20,21,22> ALL  NULL   NULL NULL NULL     NULL  
3  DERIVED   NULL         NULL NULL   NULL NULL NULL     NULL "No tables used" 
4  UNION   NULL         NULL NULL   NULL NULL NULL     NULL "No tables used" 
5  UNION   NULL         NULL NULL   NULL NULL NULL     NULL "No tables used" 
6  UNION   NULL         NULL NULL   NULL NULL NULL     NULL "No tables used" 
7  UNION   NULL         NULL NULL   NULL NULL NULL     NULL "No tables used" 
8  UNION   NULL         NULL NULL   NULL NULL NULL     NULL "No tables used" 
9  UNION   NULL         NULL NULL   NULL NULL NULL     NULL "No tables used" 
10  UNION   NULL         NULL NULL   NULL NULL NULL     NULL "No tables used" 
11  UNION   NULL         NULL NULL   NULL NULL NULL     NULL "No tables used" 
12  UNION   NULL         NULL NULL   NULL NULL NULL     NULL "No tables used" 
NULL "UNION RESULT" <union3,4,5,6,7,8,9,10,11,12>   ALL  NULL   NULL NULL NULL     NULL  

は、私は私のクエリを改善するために何ができますか?どうしてそんなに長くかかるのですか?

+0

ビューからの選択にも時間がかかりますか? – sagi

+0

いいえ、 'last_30_days'から' * 'を選ぶのは速いです。 – alexandernst

答えて

1

問題のほとんどはここにある:特に

LEFT JOIN `CONSUMO` ON sub1.fecha = DATE_FORMAT(fechahora, "%M %e") 

  • LEFTを使用しないでください。あなたはすべての行が必要です、余分なものはありません、正しい?だから、普通のJOINを使ってください。

  • インデックスはfechahoraです。

  • DESCRIBEを使用しないでください。それはSHOW CREATE TABLEより記述的ではありません。

  • 最後の30日間を何度も繰り返し再計算するのではなく、数年間の日付の長いテーブルを持ち、希望の行を制限するのにWHERE句を使用します。

  • fechahoraを関数内に非表示にしないでください。それはfechahora> = ... sub1.fecha ... とfechahora < ... sub1.fecha + INTERVAL 1日に

    のように見えるように、クエリを並べ替え...

... "%M%e"の逆数を行うために必要なものである必要があります。平文DATEデータ型を計算するには、last_30_daysを変更する方がよいでしょう。出力で特定の書式設定が必要な場合は、SELECTで行います。

+0

あなたが変更を提案したときに 'left join'を使用しないときの私のクエリの出力は、実際には何も返しません。私は 'fechahora'の指数を出しましたが、パフォーマンスはまったく同じです。 'last_30_days'は既に' DATE'型を計算します。ビューと数年の日付が入っているテーブルについて、私は実際にこれを行うためのエレガントな方法でも、物事をより良くするものでもないと確信していません。 – alexandernst

+0

これに数時間を費やした後、私は問題の根を見つけました。あなたはあなたが最後に言ったことにポイントを持っています。すべての単一のDATETIME列をDATEに変換する必要があるため、問合せには時間がかかります。 – alexandernst

関連する問題