Antworten auf deine Fragen:
Neues Thema erstellen

Datenbankabfrage beschleuingen

StephanSchuler

Noch nicht viel geschrieben

Hallo,

ich habe in einer Tabelle Werte von verschiedenen Stromzählern. Für jede Stunde habe ich einen neuen Wert. Damit möchte ich ein Monatsdiagramm ausgeben.

Aktuell nutze ich eine Funktion die mir die Differenz zwischen zwei Zeitpunkten ausgibt:

PHP:
static function getVerbrauch($zaehler_id, $startdate, $enddate){
     $query = "SELECT zaehlerstand, date FROM zaehlerimport WHERE zaehler_id = '".mysql_real_escape_string($zaehler_id)."'
                                 AND date >= '$startdate' ORDER BY date ASC";
     $res = mysql_query($query);
     $row = mysql_fetch_row($res);
     $startverbrauch = $row[0];       
     
     $query = "SELECT zaehlerstand, date FROM zaehlerimport WHERE zaehler_id = '".mysql_real_escape_string($zaehler_id)."'
                                 AND date <= '$enddate' ORDER BY date DESC";
     $res = mysql_query($query);
     $row = mysql_fetch_row($res);
     $endverbrauch = $row[0];   

     return ($endverbrauch - $startverbrauch);
   }

Dies mach ich dann für jeden Tag, für mehrere Zähler etc. bis ich meine Datenarrays für das Diagramm zusammen habe.
Dies führt dazu, dass ich für 10 Zähler ca. 15 Sekunden für die Datenabfrage benötige.

Gibt es eine Möglichkeit das zu beschleunigen?
Kann ich das auch schon im Query ausrechnen lassen, dann bräuchte ich schonmal nur die Hälfte der Abfragen.

Grüße,
Stephan
 

Duddle

Posting-Frequenz: 14µHz

Wie sieht denn die Reihenfolge deiner Abfragen aus, was ist das Muster? Fragst du für alle Zähler nacheinander exakt die gleichen Start-/Enddaten ab? Also im Pseudocode ungefähr so:
Code:
FOR startdate IN 1, 2, 3:
    FOR enddate IN 1, 2, 3:
        FOR zaehler IN a, b, c:
            staende[startdate, enddate] = getVerbrauch(zaehler, startdate, enddate);
        DONE
    DONE
DONE
Oder unterscheidet sich das mehr?

Duddle
 

lachender_engel

Aktives Mitglied

Die Abfrage von Dir braucht ie 1,5 Sekunden zur Ausführung. Die bewegt sich im Millisekundenbereich.
Die Ursache für die Verzögerung ist anderswo zu suchen. Sind die Tabellen zum Beispiel indiziert?
 

rafoldi

Aktives Mitglied

Du hast nicht gesagt welche Indexe (clusterd / nonclusterd / unique) vorhanden sind. Je nach Menge der Datensätze machen Indexe Sinn.
Allerdings verbrauchen diese Indexe auch Platz.
Eine andere Frage wäre noch die Nächte der Datenbank. Oracle? MSQL? MySQL? Je nach Hersteller / Datenbank sind andere Optimierungen Sinnvoll. Diese Optimierungen beziehen sin jedoch immer auf SQL Code und Indexe.
 

StephanSchuler

Noch nicht viel geschrieben

Ich nutze MySQL.

Ich habe nun einen Index auf die Spalte date hinzugefügt. Das hat das Ganze schonmal beschleunigt.
Ich benötige aber für den Abruf eines Tages noch immer ca. 600-700ms. Ein Tag beutet ich führe die oben genannte funktion 24 mal (für jede Stunde) in einer FOR-Schleife aus und hänge die Werte dann mit einer echo-Ausgabe hintereinander und schreibe sie damit in den HTML-Code.
Ich habe damit eine Ladezeit der Seite von ca. 5-8 Sekunden. Und das ist wenn man die Tage durchklicken möchte im sie zu vergleichen etwas mühsam! :(

Mein Muster ist so, dass ich immer ein Zähler nach dem anderen Abfrage. Ich hole also den ersten Wert von Zähler 1, dann erhöhe ich Start- und Endzeit um 1h und hole den nächsten Wert. Wenn 24 Abfragen (für einen Tag) oder 31 (für einen Monat) durch sind, dann mache ich das gleiche für den nächsten Zähler.
Bei manchen Ausgaben muss ich auch 2 - 4 Zählerwerte miteinander verrechnen. Da muss ich dann dementsprechend mehr Werte pro Datenreihe aus der Datenbank holen.

Ach, Platz für die Indexe ist eigentlich kein Problem, mein Server ist noch ziemlich leer! :)
 

rafoldi

Aktives Mitglied

Ich habe keine Ahnung von dem Datenvolumen welches Du bewegst. Wenn pro Stunde nur Datum / Uhrzeit und ein oder zwei weitere Werte angezeigt werden dann ist das definitiv zu lang.
Da Du leider keine weiteren Angaben machen möchtest ist das alles Kaffesatz lesen.
Welche Maschine wird eingesetzt, was für DB Typ, wie ist die DB Installiert worden etc.

Die Geschwindigkeit der Ausgabe von Abfragen ist von vielen Faktoren abhängig. Oftmals auch von der verwendeten Hardware.
 

StephanSchuler

Noch nicht viel geschrieben

Es handelt sich um einen dedizierten Webserver irgendwo in irgendeiner Serverfarm. OS ist Windows Web Server 2008 R2. DB Typ ist MySQL.
Dual Core 3 GHz mit 2GB Speicher.

Das DatenVolumen ist nicht wirklich viel, die Tabelle hat aktuell 21000 Einträge. Und es werden nur stündlich 4 Einträge gespeichert mit 5 Spalten (INT-Werte)
 

rafoldi

Aktives Mitglied

Hm da ist die Hardware ggf. tendenziell ein Bottelneck. Denke jedoch nicht mit der Datenmenge.
Wenn auf der Kiste dann doch mehr läuft als nur diese eine Anwendung dann bekommst Du auch diese HW nicht bereitgestellt. Die Dinger sind in der Regel virtualisiert, bedeutet die physikalische HW wird auf 50 oder 100, ggf. noch mehr Maschienen aufgeteilt.
Wenn Du Dir auf Deinem lokalen Server Server2Go einrichtest, inkl. dem Datenbestand dann kannst Du testen ob es an der HW im RZ liegt.
 

Duddle

Posting-Frequenz: 14µHz

Ich habe mal ein wenig rumgespielt, aber ohne einen konkreten Auszug deiner Daten das Beispiel notwendigerweise vereinfacht: http://sqlfiddle.com/#!9/cfa21/1 (zwei Zähler, jeweils 8 Messpunkte im Stundentakt). Das gibt dir alle Zähler mit allen Messunterschieden im Stundentakt. Wahrscheinlich schlägt das an Grenzfällen fehl, müsste man an echten Daten anschauen.


Duddle
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.611
Beiträge
1.538.341
Mitglieder
67.524
Neuestes Mitglied
BSKGA
Oben