Optimale Abfrage zum Abrufen einer kumulativen Summe in MySQL

8

Was ist eine 'richtige' Abfrage, um eine kumulative Summe in MySQL abzurufen?

Ich habe eine Tabelle, wo ich Informationen über Dateien aufbewahre, eine Spaltenliste enthält die Größe der Dateien in Bytes. (Die tatsächlichen Dateien werden irgendwo auf der Festplatte gespeichert)

Ich möchte die kumulative Dateigröße wie folgt erhalten:

%Vor%

Im Moment verwende ich die folgende Abfrage, um die obigen Ergebnisse zu erhalten

%Vor%

Meine Lösung ist jedoch extrem langsam. (ungefähr 19 Sekunden ohne Cache).

Erklärung gibt die folgenden Ausführungsdetails

%Vor%



Meine Frage ist:

Wie kann ich die obige Abfrage optimieren?



Aktualisieren
Ich habe die Frage aktualisiert, um die Tabellenstruktur und eine Prozedur zur Verfügung zu stellen, die die Tabelle mit 20.000 Datensatz-Testdaten füllt.

%Vor%

Über die mögliche doppelte Frage
Die Frage verbunden durch Forgotten Semicolon ist nicht die gleiche Frage. Meine Frage hat extra Spalte. Wegen dieser zusätzlichen groupId-Spalte funktioniert die akzeptierte Antwort nicht für mein Problem. (vielleicht kann es angepasst werden, um zu arbeiten, aber ich weiß nicht wie, daher meine Frage)

    
Jacco 29.06.2010, 21:10
quelle

2 Antworten

18

Sie könnten eine Variable verwenden - sie ist viel schneller als jeder Join:

%Vor%

Hier ist ein schneller Testfall auf einem Pentium III mit 128 MB RAM unter Debian 5.0:

Erstellen Sie die Tabelle:

%Vor%

Füllen Sie 20.000 Zufallszahlen:

%Vor%

Überprüfen Sie die Zeilenanzahl:

%Vor%

Führen Sie die kumulative Gesamtabfrage aus:

%Vor%

AKTUALISIEREN

Ich hatte in der ursprünglichen Frage die Gruppierung nach groupId verpasst, und das hat die Dinge sicherlich etwas komplizierter gemacht. Ich schrieb dann eine Lösung, die einen temporären Tisch benutzte, aber ich mochte es nicht - es war unordentlich und übermäßig kompliziert. Ich bin weggegangen und habe mehr geforscht und etwas viel Einfacheres und Schnelleres erfunden.

Ich kann nicht den ganzen Kredit dafür beanspruchen - tatsächlich kann ich kaum irgendwelche Ansprüche geltend machen, da es nur eine modifizierte Version von Nummer der Zeile aus gemeinsamen MySQL-Abfragen emulieren.

Es ist schön einfach, elegant und sehr schnell:

%Vor%

Sie können die äußere SELECT ... AS tmp entfernen, wenn es Ihnen nichts ausmacht, dass die Spalte prev_groupID zurückgegeben wird. Ich fand, dass es marginal schneller ohne es lief.

Hier ist ein einfacher Testfall:

%Vor%

Hier ist ein Beispiel für die letzten Zeilen aus einer Tabelle mit 20.000 Zeilen:

%Vor%     
Mike 29.06.2010, 21:16
quelle
1

Ich denke, dass MySQL nur einen der Indizes in der Tabelle verwendet. In diesem Fall wählen Sie den Index für foreignId.

Fügen Sie einen Deckungsindex hinzu, der sowohl primaryId als auch foreignId enthält.

    
Marcus Adams 29.06.2010 21:14
quelle

Tags und Links