Textfile vs. (My)SQL - (Ab) wann ist SQL besser?

Aus reinem Wissensdrang wollte ich mal wissen, was ihr findet, ab wann eine MySQL-Datenbanke einem einfach kleinen Textfile vorzuziehen wäre.

Könnte man z.B. sagen, dass ab einer gewissen Grösse oder Anz. Einträge MySQL schneller/besser ist.

Oder ist SQL einfach “nur” desshalb besser weil Auswertungen über die geregelte Strukturierung der Datenbanken komfortabler zu erledigen sind?

Ich hab auch schon mal gehört, dass SQL-Datenbanken eine gewisse “Performance” des Servers voraussetzen und den auch langsamer machen können… Stimmt das?
–> interessant wäre hier auch die Meinung eines Admins wie miro, der das richtig beurteilen kann

Oder gibt es andere Argumente, die ich bisher vergessen habe?

Eigentlich sind RDBMS’ ja dazu da, Daten strukturiert zu speichern. Gelagert werden die Daten ja letztendlich auch in Dateien auf dem Server. Grundsätzlich ist immer ein Datenbanksystem vorzuziehen, aber das liegt eben daran, dass… nun, ich gebe dir mal ein Szenario.

Ein kleiner Counter, der sich bei jedem Aufruf um 1 erhöht und den Wert in einer Textdatei speichert. MySQL wäre hier vollkommen unsinnig.

Doch jetzt willst du, sagen wir mal, eine IP-Sperre, sodass jede IP nur einmal gezählt wird. Also wird die IP zusammen mit dem Timestamp in einer neuen Datei abgelegt, jeweils in eine Zeile. Bei jedem Aufruf wird die gesamte Datei Zeile für Zeile gelesen, um zu sehen, ob die IP schon vorhanden ist. Aber ich nehme an, dass deine Seite nicht Hunderttausende von Besuchern täglich anlockt, also naja.

Doch dann wird dir klar, dass 90% aller IPs gegen Mitternacht neu vergeben werden und du viele alte IPs speicherst. Lösung: Beim Aufruf des Counters wird wieder die ganze Datei gelesen und der Timestamp analysiert, ob der Tag des Timestamps der heutige ist. Wenn nicht wird die Zeile gelöscht - Moment mal, wie denn? Du müsstest die ganze Datei im Speicher wieder zusammensetzen und alte Zeilen dabei auslassen.

Nicht zu vergessen: PHP ist nicht dafür geschaffen, mit großen Textdateien zu arbeiten, und die File-I/O-Performance (besonders bei großen Dateien) auf PHP-Level ist schrecklich.

Wenn es sinnvoll wäre, dass deine Daten Reihen-Struktur haben wie im Szenario oben, bietet sich MySQL oder ein anderes RDBMS an. Im Falle eines Counters, der nur einfache Daten zwischen Requests speichert, ist das grober Blödsinn - das wäre eine Tabelle mit einer Zeile. :susp:
… und ganz komplexe Script wie phpBB3 sind damit so gut wie unmöglich. Nein ehrlich, ich würde gerne mal den Olympus-Quelltext sehen, wenn er umgeschrieben wurde, um Flatfiles zu benutzen. :smiley: [size=50](SQLite zählt nicht)[/size]

Also ich denke von der Verwaltung her usw. ist SQL das beste.
txt wär nur für Leute die kein SQL Space haben.
Man hat ne bessere übersicht und ich bin der Meinung die SQL Dateien sind kleiner als ne normale TXT.
Müsst ich mal vergleichen :smiley:

Danke Scram,

Deine Erläuterungen sind plausibel und konnte ich gut nachvollziehen, so dass ich nun ein gewisse Vorstellung habe.

Man könnte auch formulieren, daß Datenbanken dazu erdacht
wurden, komplexe korrelierte Datensätze zu bearbeiten,
besonders auch, um darin effektiv nach Daten zu suchen, wo
man beim Abspeichern nicht weiß, wie sie später genutzt werden
oder wo es verschiedene Nutzungsmöglichkeiten gibt und damit
verschiedene Korrelationen zwischen einzelnen Datensätzen.

Bei der ebenfall häufig vorkommenden PHP-Anwendung, daß
man eine Ausgabe aus Dokumentfragmenten zusammensetzen
will (Kopf, Fuß, Menü, Inhalt), weiß man ja genau, um was es
geht und wie der Kram verwendet wird. Man muß nichts suchen
und anders korrelieren als man es anfangs geplant hat. Da
eignen sich Textdateien eher.
Zudem ist eine Datenbank immer ein zusätzliches Programm,
was unabhängig vom Apachen und vom PHP ein Problem haben
kann, was bei Textdateien eher nicht passieren kann. Eine
Anwendung mit Textdateien ist also nicht auf das zusätzliche
Programm angewiesen. Noch stabiler läuft alles natürlich, wenn
man nur Textdateien und keine PHP-Skripte verwendet, ist
allerdings in der Planung und Aktualisierung aufwendiger.

Bei einer Datenbank hat man also ein zusätzliches Risiko, man
muß aber das effektive Suchen und Korrelieren von Datensätzen
nicht mehr selber programmieren. Wenn man eine solche
Such- und Korrelationsanwendung hat, lohnt sich das Risiko
natürlich und der Nutzen überwiegt deutlich. Trifft das nicht zu,
so kann eine simple Dateienlösung durchaus vorteilhafter und
einfacher sein. Je weniger man über die spätere Nutzung von
Daten weiß, desto sperriger werden Textdateien und desto
effektiver wird es, sich des Datenbankprogrammes zu bedienen.

Ah super! Vielen Dank euch allen.

Ich kann also draus schliessen, wenn ich z.B. ein Portal aufbaue, wo von einzelne User mehrere Daten gespeichert werden und diese für verschiedene Auswertungen/Statistiken einzeln ausgelesen werden müssen, ist die Lösung mit einer Datenbank wohl am besten geeignet - zumal ich auch zukünftig das Portal weiter entwicklen will, so gelange ich genau an den von dir erwähnten Punk: "Je weniger man über die spätere Nutzung von
Daten weiß, desto sperriger werden Textdateien "

Hmm… das heisst wohl auch, dass ich mich nebem php auch noch in MySQL einarbeiten muss!!

Ein böses Beispiel hinsichtlich Datenbanken haben ich noch ;o)

Man kann etwa bei MySQL und ähnlichen auch große Objekte
abspeichern. Verwendet man das bei einer Bildergalerie, um
die Bilder selbst in der Datenbank (!) abzuspeichern, so hat man
sich selbst oder den anderen Nutzern der Datenbank und des
servers ins Knie geschossen, denn an sowas hat die Datenbank
schwer zu schaffen.

Sollte man bei der Bildergalerie aufgrund Größe und
Komplexität der Suchmöglichkeiten dennoch eine Datenbank
benötigen, so empfiehlt es sich, die Pixelgraphiken als statische
Dateien abzulegen und in der Datenbank nur die Pfade zu den
jeweiligen Bildern abzulegen, also nur mit den Referenzen zu
optimieren, nicht mit den Dateien selbst.
Ähnliches gilt wohl auch für sonstwie große Datenpakete, die
nie durchsucht werden sollen und die einfach nur ausgegeben
werden sollen (Video, Audio, große Textblöcke ohne
PHP-Skriptfragmente).

Naja … aber dann denke ist ist das Script einfach schlecht programmiert und basta! Weil es gibt genügend Scripts die zeigen, dass es auch ohne geht!!

Trotzdem Danke für die Hinweise. Ich möchte jedoch nur Text speichern!

Nimm auf jeden Fall MySQL/PgSQL…alleine schon wegen der Möglichkeiten…

DELETE FROM `IP_BLOCK` WHERE `time` < NOW() - 21600;

Das löscht alle IPs, die älter als 6 Stunden sind…hast du eine Ahnung was das mit Textdateien wäre???

$ip=file("ips.txt");
foreach($ip as $id => $one)
{
   $temp=explode("||", $one);
   if($temp[0] < time() - 21600)
      unset($ip[$id]);
}
file_put_contents("ips.txt", implode("\n", $ip));

Vorteile klar??? :smiley:

JA :wink: