Erhalte viele gruppierte Werte von mysql

8

Ich habe eine solche Tabellenstruktur:

%Vor%

Dies hat ungefähr 30 Spalten mit einigen Spalten, die Werte von 0-200 (a, b) haben und einige haben nur 5 Werte (0,1,2,3,4) (Spalte c-d). Es gibt ungefähr. 120.000 Zeilen in der Tabelle.

Um die Anzahl der Elemente pro Zeile anzuzeigen, verwende ich eine Abfrage für jede Spalte:

%Vor%

Das Problem dabei ist, dass es 30 Abfragen (eine pro Spalte) auslöst und grundsätzlich jedes Mal denselben Datensatz durchläuft.

Gibt es einen besseren Weg, dies zu tun?

Ich habe versucht, mit GROUP BY WITH ROLLUP, aber dies führt zu einer massiven Ergebnismenge, die langsamer als jede einzelne Abfrage verarbeitet wird.

Sie können eine Auswahl der Daten in SQLfiddle anzeigen: Ссылка

    
Nin 21.09.2012, 11:57
quelle

5 Antworten

2

Vielleicht wird so etwas schneller funktionieren.

%Vor%     
user1516873 24.09.2012, 11:44
quelle
3
%Vor%

Ich weiß nicht, ob es besser ist, aber zumindest hat der Planer eine Chance, es zu optimieren.

    
Clodoaldo Neto 21.09.2012 12:08
quelle
1

BEARBEITEN : Diese Antwort ist vollständig von der Spur entfernt

Versuchen Sie Folgendes; Es ist eine sauberere Abfrage mit nur einem Durchlauf, aber ich bin mir nicht sicher, wie gut es aufgrund der DISTINCT funktionieren wird:

%Vor%     
Shlomi Noach 27.09.2012 11:31
quelle
0

Nichts Original, aber Sie könnten dieses hier ausprobieren.

%Vor%

Aber wenn Leistung hier ein Problem ist, würde ich gerne das gleiche vorschlagen @edze vorgeschlagen - Index auf Spalten (ja alle 30). Es wird Platz kosten, aber die Leistung steigern. Oder erstellen Sie sogar View-Tabelle

%Vor%

für diese Aufgabe und dann einfach wählen, wenn es oft durchgeführt wird.

    
icebreaker 28.09.2012 12:34
quelle
0

Abhängig von der Ökologie hier könnte es effizienter sein, eine Tabelle von Aggregatdaten einmal zu erstellen und sie dann auf dem neuesten Stand zu halten, wenn diese Tabelle geändert wird. Ihre aggregierte Datentabelle würde eine Zeile für jeden (aktuellen) Wert und dann 30 zusätzliche Spalten mit Zählwerten haben. Dann können Sie Trigger auf das Original setzen, die die Anzahl aktualisieren. Das verlangsamt natürlich die Schreiboperationen für die Originaltabelle, fügt aber 30 Indizes hinzu.

    
FoolishSeth 01.10.2012 06:29
quelle

Tags und Links