2016-05-07 13 views
0

ich großen TischMySQL Tuning - zu mutch SUM (CASE WHEN ... THEN ... END) benötigt

customer_id ; category ; quantity ;budget  ; profit 
     15570 ; garden ; 1.000,00 ; 1.325,00 ;  59,94 
     17090 ; cars  ; 9.600,00 ; 11.671,76 ; -409,28 
     10360 ; cars  ; 12.110,00 ; 3.981,60 ; 961,97 
     10360 ; garden ; 10.150,00 ; 4.828,95 ; 872,27 
     16460 ; toys  ; 24.000,00 ; 19.656,00 ; 991,00 
     18260 ; metal ; 24.000,00 ; 17.688,00 ; -1.131,52 
... 

und diese Abfrage zu finden Menge, Budget, Gewinn für jede Kategorie

SELECT customer_id, 

(SUM(CASE WHEN category = 'garden' THEN budget END)) as budget1, 
(SUM(CASE WHEN category = 'garden' THEN quantity END)) as quantity1, 
(SUM(CASE WHEN category = 'garden' THEN profit END)) as profit1, 

(SUM(CASE WHEN category = 'cars' THEN budget END)) as budget2, 
(SUM(CASE WHEN category = 'cars' THEN quantity END)) as quantity2, 
(SUM(CASE WHEN category = 'cars' THEN profit END)) as profit2, 

(SUM(CASE WHEN category = 'toys' THEN budget END)) as budget3, 
(SUM(CASE WHEN category = 'toys' THEN quantity END)) as quantity3, 
(SUM(CASE WHEN category = 'toys' THEN profit END)) as profit3, 

(SUM(CASE WHEN category = 'metal' THEN budget END)) as budget4, 
(SUM(CASE WHEN category = 'metal' THEN quantity END)) as quantity4, 
(SUM(CASE WHEN category = 'metal' THEN profit END)) as profit4 

SUM(budget) as budget, 
SUM(quantity) as quantity, 
SUM(profit) as profit 

FROM `sales` GROUP BY customer_id 
haben

Ist es möglich, die Abfrage schneller (effizienter) zu machen?

Vielen Dank!

+0

Sie können einen Index auf 'customer_id' versuchen, aber ich denke nicht, dass das hilft. MySQL hat nicht viele Optionen, um Aggregationsabfragen zu optimieren. –

+0

Geben Sie auch Beispieldaten an, mit denen Sie feststellen können, ob es andere Möglichkeiten gibt, dieselben Ergebnisse zu erzielen. –

+0

Vermutlich (customer_id, category) ist Ihr PRIMÄRSCHLÜSSEL? – Strawberry

Antwort

1

Ich bezweifle es viel Unterschied zu Performance macht, aber ich würde die Abfrage als ...

SELECT customer_id 
     , category 
     , SUM(quantity) total_quantity 
     , SUM(budget) total_budget 
     , SUM(profit) total_profit 
    FROM sales 
    GROUP 
    BY customer_id 
     , category; 

... und behandeln alle verbleibenden Probleme bei der Anzeige in der Präsentationsschicht ausgeführt werden.

+0

Da es die ganze Tabelle ist, _Adding_ ein Index wird nicht helfen. Wenn Sie 'PRIMARY KEY (customer_id, category)' in dieser Reihenfolge verwenden, sollten Sie den filesort vermeiden. –