Tabelle vs. Datei - wer gewinnt?



  • Folgende Situation: ich muss bei jedem Schleifendurchlauf einen Teil einer etwas großen MySQL-Tabelle einladen, weil der Prozess nicht derselbe ist und der Heap verloren geht (CGI halt). Es handelt sich hierbei um recht statische Daten, welche nur von mir geändert werden können, und ich habe sowieso vor, diese linear zu bearbeiten.

    Die Frage: um Performance zu gewinnen - würde es sich da lohnen, die Daten in eine externe Datei zu laden und von diesem "Cache" aus auf diese zuzugreifen?



  • Die Frage lässt sich so einfach nicht beantworten. Angaben wie "groß" sind natürlich viel zu subjektiv. Außerdem spielen noch viel mehr Faktoren eine Rolle.

    Läuft der Server lokal oder auf einem entfernten Rechner?
    Wie groß ist die Bandbreite des Internetnetzes?
    Wie schnell ist die Festplatte?
    Wie groß ist der RAM?
    Was ist "groß"?

    Alles in allem ist es sehr fraglich, ob sich diese "Optimierung" überhaupt für den Anwendungszweck rentiert. Was ist das für eine Anwendung? Ist sie so zeitintensiv?

    Man darf auch nicht vergessen, dass durch das Schreiben und Lesen in der Datei auch Zeit verloregen geht. Die Daten müssen ja auch in einem geeigneten Format abgespeichert werden, was auch auf die Laufzeit gehen könnte.

    Meine Tendenz geht daher eher dahin, dass die Datenbank schneller ist, weil sie die Daten ohnehin schon bereithält. Aber ein Test wäre hier wohl am aussagekräftigsten und würde die Realität auch angemessener widerspiegeln.



  • jghjghjgh schrieb:

    Die Frage lässt sich so einfach nicht beantworten. Angaben wie "groß" sind natürlich viel zu subjektiv. Außerdem spielen noch viel mehr Faktoren eine Rolle.

    Läuft der Server lokal oder auf einem entfernten Rechner?
    Wie groß ist die Bandbreite des Internetnetzes?
    Wie schnell ist die Festplatte?
    Wie groß ist der RAM?
    Was ist "groß"?

    Alles in allem ist es sehr fraglich, ob sich diese "Optimierung" überhaupt für den Anwendungszweck rentiert. Was ist das für eine Anwendung? Ist sie so zeitintensiv?

    Man darf auch nicht vergessen, dass durch das Schreiben und Lesen in der Datei auch Zeit verloregen geht. Die Daten müssen ja auch in einem geeigneten Format abgespeichert werden, was auch auf die Laufzeit gehen könnte.

    Meine Tendenz geht daher eher dahin, dass die Datenbank schneller ist, weil sie die Daten ohnehin schon bereithält. Aber ein Test wäre hier wohl am aussagekräftigsten und würde die Realität auch angemessener widerspiegeln.

    Der Dienst läuft auf localhost, die Bandbreite des Netzes kenn ich nicht, da ich allerdings auf den eigenen Rechner zugreife, sollte das kein Problem darstellen. Da auch die Datenbank auf der Festplatte liegt, vermute ich, dass dies ebenfalls keine Rolle spielt. Groß sind ... an die 10.000 Datensätze mit 10 Feldern und 'ner Menge Text. Ich benötige aber nur einen Referenzcode (ein paar Zeichen) und den Primärschlüssel. Und RAM sind 4 GB.



  • Es lohnt sich.

    Ich mache das auch so, generell sind gespeicherte Tabellen dramatisch schneller.

    (WinXP, Apache, SQLite, C).

    Aus der Abfrage bilde ich einen MD5 und nehme den als Dateinamen. In diese Datei
    schreibe ich die Ergebnisse. Bevor eine SQL-Abfrage läuft schaue ich nach ob die
    Datenbank älter oder jünger wie die Abfrage ist (dh, DB geändert seitdem die
    Cachedatei erstellt wurde ?).

    Geht prima !

    Bis SQLite die Datenbank auch nur geöffnet hat, sende ich schon die Ergebnisse.



  • Ich habe jetzt eine Funktion implementiert, welche einen benutzerdefinierten Dump der Tabelle erstellt, und habe das Laden aus der Datenbank durch öffnen und parsen der Datei ersetzt. Und ich muss sagen, die Ausführungsgeschwindigkeit ist schon geringer - ich spare hier zwei Drittel der Zeit. 😮.

    Das Schöne: ich kann mir das Hash-Konstrukt sparen, weil ich bestimme, wann die Datei geändert wird. Dies wird außerdem über eine eigene Funktion gemacht, sodass der Dump wieder genau dann neu erstellt werden kann, wenn er aktuell sein soll. Danke für die Ermutigung, Scheppertreiber. 😃



  • Gern geschehen.

    Ich hatte das mit clock() ausgemessen. Ich hatte Suchzeiten von 70 sec bis
    Start der Auslieferung über den Webserver, die sind auf 0.5 zusammengeschnurrt
    (je nach SQL-Statement, ca 10 Mio Records).

    In der Cachedatei habe ich das komplette HTML bis auf die Spaltenköpfe,
    dh die Cachedatei lese ich mit read() und haue die mit fwrite() auf stdout.

    Die Transferzeiten über den Webserver ändert es leider nicht.


Anmelden zum Antworten