25.000.000 Datensätze in mySQL ???
snorri
- datenbank
0 Cheatah0 Andreas0 Michael Schröpl0 snorri
Hallo,
für eine Transportkostenberechnung brauche ich Entfernungen zwischen Start- und Zielort. Dazu habe ich eine Datei, die die Entfernungen zwischen ca. 7.000 Orten in Deutschland enthält, also (7.000x7.000)/2 = ca. 25.000.000 einzelne Datensätze. Das System läuft mit PHP4 und mySQL.
Kann ich allen Ernstes solche Datenmengen in eine mySQL-Datenbank stopfen? und mitt sinnvoller Geschwindigkeit auch wieder auslesen?
Wäre es besser, wenn ich versuche, das aus der Textdatei (Matrixform) direkt auszulesen?
Wenn nicht: Was mach' ich statt dessen?
Danke,
snorri
Hi,
Kann ich allen Ernstes solche Datenmengen in eine mySQL-Datenbank stopfen?
ja, warum denn nicht? Tabelle mit drei Spalten: von_ort, ziel_ort (beide vom Typ Number; ggf. hast Du eine ort-Tabelle, auf die Du joinst, um die Namen zu erhalten), entfernung.
und mitt sinnvoller Geschwindigkeit auch wieder auslesen?
Zweispaltiger Index über von_ort und ziel_ort.
Wäre es besser, wenn ich versuche, das aus der Textdatei (Matrixform) direkt auszulesen?
Herrje, das musst Du ausprobieren. Am sinnvollsten ist es möglicherweise sogar, ein zweidimensionales Array persistent im Speicher zu halten - wie auch immer Du das dann machst ;-)
Cheatah
Moin!
Hab letztens folgendes gelesen:
MySQL
MySQL ist ein echtes Multi-User und Multi-Thread SQL Datenbank Server. SQL (Structured Query Language) ist eine Standard Datenbank Sprache und wird weltweit am häufigsten genutzt. MySQL ist schnell, robust und leicht in der Handhabung. MySQL wurde entwickelt weil die Entwickler einen schnellen SQL Server für sehr große Datenbanken benötigten. Die Entwickler benutzen MySQL seit 1996 mit mehr als 40 Datenbanken welche circa 10,000 Tabellen enthalten. Mehr als 500 davon enthalten mehr als 7 Millionen Datensätze. So werden etwa 100 GB an wichtigen Daten verwaltet. Einige davon enthalten bereits 50 Millionen Datensätze. Unseren Kunden bieten wir nur das an, was wir auch selbst benutzen.
http://www.fahr.net/internet/index.php3?file=glossar.html
(bei Google gefunden, kenne ich aber sonst nicht, aber warum sollten die lügen :)
Grüße
Andreas
Hi,
Kann ich allen Ernstes solche Datenmengen in eine
mySQL-Datenbank stopfen?
Ja, sicher.
Du solltest Dir aber Gedanken darüber machen, wann und wie Du die Indexe aufbaust:
a) Zuerst Indexe definieren, dann 25 Millionen Datensätze einfügen dauert unglaublich lange (es kann sich nicht nur um Stunden, sondern um Tage handeln).
b) Zuerst 25 Millionen Datensätze einfügen, dann indexen geht viel schneller, benötigt aber enorm viel RAM und eine hinreichend große mySQL-Konfiguration. (Mit der "kleinen" Konfiguration bin ich in einem solchen Fall schon in mySQL-Endlosschleifen mit 100% CPU-Auslastung geraten; mit der "mittleren" habe ich mal 14 Millionen Datensätze in einem Rutsch geindext, was dann eine halbe Stunde auf einer Solaris-Maschine gedauert hat.)
In eine Tabelle mit solchen Datenmengen sollte man möglichst nicht ständig etwas einfügen oder etwas aus ihr löschen (sonder degeneriert der Index zu schnell). Aber sie als readonly-Tabelle zu halten, nur um etwas darin zu suchen, dafür ist mySQL m. E. ausgezeichnet geeignet.
und mit sinnvoller Geschwindigkeit auch wieder auslesen?
Das ist kleine Frage der Datenmenge, sondern der Projektivität Deines Index.
In Deinem Fall würde ich sagen "kein Problem", weil Dein Index ja nur eindeutige Treffer liefern wird, also phantastisch gut filtert.
Wäre es besser, wenn ich versuche, das aus der
Textdatei (Matrixform) direkt auszulesen?
Bestimmt nicht. Du bräuchtest ja jedes Mal einen full table scan, weil Deine Textdatei keine vernünftigen Zugriffspfade erlaubt. Das ist viel zu langsam.
Wenn nicht: Was mach' ich statt dessen?
Die Idee, alles ins RAM zu ballern, wäre natürlich noch schneller (sofern Du so viel RAM hast).
Aber im Prinzip kannst Du genau das auch mit mySQL erreichen, wenn Du die Konfiguration entsprechend einstellst. (Bei der Beschreibung der innoDB-Tabellen habe ich mal gelesen, daß das der Tabellentreiber sogar selbst entscheidet, ob er eine Tabelle vollständig ins RAM einlagert oder nicht ...)
Viele Grüße
Michael
Danke an alle! Ich werds versuchen (und bei der Gelegenheit die Performance vergleichen mit dem Auslesen aus einer Datei, in der alle Werte in klar definierten Zeilen stehen).
Servus,
snorri