mysql RIESENDATENBANK geschwindigkeit



  • Hallo!
    http://neo.dyndns.info/graph.php?h=400&w=2000
    Die Daten für diesen Graph werden aus einer MySQL datenbank geholt. Die Datenbank wird nun immer grösser. Um den Graph zu zeichnen mache ich einfach

    SELECT SPALTE FROM TABELLE
    

    und verwende JEDEN WERT. Natürlich brauche ich nicht JEDEN WERT sondern nur so viele, dass der Graph auf eine breite von X pixel optimal gezeichnet werden kann. Ist es möglich mit SELECT nur die benötigten datensätze zu holen? Würde es das Zeichnen beschleunigen?

    EDIT:
    vielleicht sowas wie

    SELECT SPALTE FROM TABELLE ABSTAND ZWISCHEN DEN WERTEN=XY STUNDEN
    


  • Ja, mit einer WHERE Bedingung?



  • Hallo neoexpert,

    ohne dein Datenbankmodell zu kennen:
    Du kannst deine SELECT-Abfrage einschränken, indem du eine WHERE-Klausel benutzt, z.B.:

    SELECT spalte FROM tabelle WHERE (stunden >= 2) AND (stunden <= 4)
    

    Viele Grüße,
    MaBa



  • Wie geht das denn?
    mit WHERE kann ich z.B. DEN BEREICH eingrenzen z.B.
    SELECT SPALTE FROM TABELLE WHERE TIMESTAMP < FROM_UNIXTIME(X) AND TIMESTAMP > FROM_UNIXTIME(Y)
    Kann ich nun mit WHERE z.B. JEDEN Zweiten oder XY-nten Wert selektieren?



  • ODER: Wie würdet IHR es machen?
    Die Wetterdaten (Temperatur, Luftfeucdhte etc) werden zu jeder vollen minute erfasst und in die Datenbank mit INSERT insertiert. Kann man mit MySQL das Zeichnen irgendwie beschleunigen? Besser gesagt nicht das Zeichnen sondern das Holen der Daten.



  • Dann versuch mal sowas:

    SELECT spalte FROM tabelle WHERE (id MOD 4) = 0
    

    Ungetestet, aber damit sollte jeder vierte Datensatz ausgelesen werden.

    Viele Grüße,
    MaBa



  • Für Messdaten kenne ich auch noch folgende Tricks:

    a) Mehrere Tabellen

    Man teilt die Meßwerte gemäß Modulo auf Tabellen auf, Beispiel für 8 Messwerte:

    T1, T2, T3, T4, T1, T2, T3, T4

    Hast Du nun Zoom 1/4, liefert Dir select * from T1 Deine Werte. Für Zoom 1/2 dann select * from T1 und ein select * from T3. Denn die Komposition der Werte im Speicher ist dramatisch schneller als die DB-Abfrage. Und die Tabellen werden auch nicht ganz so groß. Für alle Daten dann 4 Abfragen entsprechend.

    b) Mehrere Tabellen

    Lustig ist auch folgende Variante:

    In der Tabelle T1 liegen alle Meßwerte.
    In der Tabelle T2 liegt die Hälfte der Meßwerte, allerdings ist 1 Wert immer aus 2 benachbarten Werten von T1 berechnet (z.B. Mittelwert, oder Min, oder Max - je nach Anwendung).
    In der Tabelle T4 liegt ein Viertel der Meßwerte, jeder Wert ist aus 4 Werten von T1 berechnet.
    Etc - je nach Zoomtiefe.

    Bin ich im ersten Zoom, dann mache ich ein select * from T4. Zoom ich, dann select * from T2. Usw.

    Nachteil: die Datenbankgröße nimmt zu, da Daten redundant gespeichert sind. Dafür geht die Gewinnung von Daten sehr schnell voran, man kann auf diese Weise extrem schnell einen Wochengraph darstellen, obwohl der vielleicht auf 100 Mio Werten beruht - aber man fragt nur 1000 ab.

    Besonders interessant ist das übrigens für die Archivierung, falls ich nur die Daten der letzten 4 Wochen 1:1 aufheben will, aber ältere Daten löschen will, dann lösche ich regelmäßig alle Daten aus T1 und T2, die älter als 4 Wochen sind.

    Beliebige Kombinationen aus diesen Ideen sind natürlich denkbar.



  • Und wenn Du wirklich viele Daten hast dann solltest Du über ein Profisystem nachdenken.
    MySQL ist mit wenig Daten sehr schnell aber das ändert sich je mehr Datensätze in den Tabellen sind.
    Nicht umsonst kosten RDBMS wie MSSQL und Oracle so viel Geld.
    Ich kämpfe derzeit mit einer MySQL jenseits der 40 GB.
    Horror und icht mehr leicht zu ändern.
    Zum Glück nicht von mir.
    Die selben Daten mit MSSQL liefern teilweise eine Steigerung der Geschwindigkeit um 1000%.


Anmelden zum Antworten