phpbar.de logo

Mailinglisten-Archive

[dbs] Wie finde ich die passenden Datensätze am schnellsten?

[dbs] Wie finde ich die passenden Datensätze am schnellsten?

Michael Hansen webmaster at web-prinz.de
Mon Okt 30 23:43:47 CET 2006


Hallo René,

René Thiel schrieb:
> 
> Michael Hansen schrieb:
> > Ich habe die von dir angeregte Diskussion zum Auswerten von Logfiles
> > mitverfolgt und bin ganz ehrlich davon nicht sehr begeistert. Bitte
> verstehe
> > mich nicht falsch und nimm es nicht zu sehr persönlich, aber vielleicht
> > solltest du erst einmal kleinere Brötchen backen, wenn sich dein Wissen
> doch
> > so arg beschränkt...
> 
> Wenn Du das mitverfolgt hast, hast Du sicher auch gelesen, dass die
> Brötchen anfangs viel kleiner waren (1/20) und dafür reichte ja mein
> beschränktes Wissen - der Auftraggeber war damals sehr zufrieden...

Nun gut aber auch 50.000 Datensätze wollen gerne schon effizient verwaltet
werden und normalerweise denkt man ja auch für die Zukunft voraus. Warum
habe ich überhaupt solch eine Bemerkung gemacht? Ich studiere Informatik,
spezialisiere mich auf Datenbanksysteme und erfahre immer wieder direkt oder
indirekt (über Erzählungen meines Professors) wie ein Projekt oder sogar ein
ganzes Unternehmen letztendlich scheiterte, da sich das Wissen über
Datenbanksysteme stark beschränkte... Nun ja, das mag in deinem Fall
zugegebenermaßen noch etwas weit hergeholt sein. Ich will jetzt auch gar
nicht weiter darauf rum reiten. Sei froh wenn du einen Kunden hast, der dir
jetzt die Zeit lässt dein Wissensstand aufzubessern. 

> > Bei dem jetzigen Problem verstehe ich noch nicht warum du 3 verschiedene
> > Querys brauchst bzw. was du damit konkret bezwecken willst!?
> 
> Genau das war meine Frage: wie finde ich die passenden Datensätze
> am schnellsten? Dass diese 3 Querys zu lange dauern, schrieb ich ja.

Ich kann auch sehr gut von einer magischen Blackbox ausgehen und sehe nur
diese 3 Anfragen und alles andere kommt und geht in meine magische Blackbox.
Dann kann ich dir Tipps zum Optimieren deiner 3 Anfragen geben aber ob es im
gesamten Kontext gesehen die optimale Lösung für dein Problem ist, sei
dahingestellt. Ich wollte nur einen Blick über den Tellerrand wagen um
vielleicht eine bessere Lösung vorschlagen zu können.

> Was das mit Transaktionsfähigkeit oder Update- und Delete-Operationen
> tu tun hat, ist mir jetzt nicht klar.

Inzwischen denke ich auch nicht mehr dass es um Transaktionsfähigkeit geht.
Ich dachte zunächst du versuchst eigenständig eine Art Transaktionsfähigkeit
bereitzustellen.

> > So wie ich es aber jetzt verstanden habe, fügst du einmal deine Logdaten
> > in die Datenbank ein und arbeitest dann nur noch auf diesen.
> 
> Richtig, die Log-Daten kommen erstmal (alle) aufbereitet in die DB:
> 
> 1 Datum/Zeit CALL_0 Alloc
> 2 Datum/Zeit CALL_2 Alloc
> 3 Datum/Zeit CALL_0 Rel      602->220
> 4 Datum/Zeit CALL_0 Free
> 5 Datum/Zeit CALL_2 Rel      325->431
> 6 Datum/Zeit CALL_0 Alloc
> 7 Datum/Zeit CALL_2 Free
> 8 Datum/Zeit CALL_0 Rel      542->250
> 9 Datum/Zeit CALL_0 Free
> .....
> 
> Das ca. 1.000.000 Zeilen lang mit bis zu 20 verschiedenen CALL_X
> (Kanälen) durcheinander.
> Also suche ich bei der Auswertung (Schritt 2 nach dem Einlesen)
> zur Zeile 7 die zugehörigen Zeilen (hier: 5 und 2), um die Dauer der
> Verbindung von 325 nach 431 (und aller anderen) zu erhalten.
> 
> Später (Schritt 3: Anzeige) werden alle Verbindungen von 325 nach
> 431 pro Tag/Woche/Monat addiert und sämtliche Verbindungen
> statistisch ausgewertet (inkl. Tortengrafik).
> 
> Um der Frage vorzubeugen: nach Calls zu sortieren, wäre ohne Sinn,
> da 542->250 beispielsweise wenig später über CALL_8 laufen könnte.
> Und nach Verbindungen kann auch nicht sortiert werden, da Alloc
> und Free keine Verbindungsdaten enthalten, aber die wichtigen Zeiten
> für Beginn und Ende der Verbindung.
> 
> Jetzt ein wenig klarer?
> 

Jein, ich schätze es geht um die Nachverfolgung von Zugriffen? In deiner
ersten Tabelle schreibst du die "Rohdaten" so wie sie im Log existieren und
in der zweiten Tabelle ordnest du die Zugriffe vermutlich gleicher Personen
einander zu? Auch wenn ich es immer noch nicht ganz verstanden habe,
schmeiße ich nun mal den Begriff "Rekursion" in den Raum. Rekursion ist aber
unter MySQL nur mit bestimmten Storage Engines anwendbar und ich weiß nicht
welche Storage Engine du verwendest und ob ggf. ein Wechsel in Betracht
käme. 

> > Struktur der Tabelle (Schlüssel, Indizes).
> 
> Alle Daten aus Log-Datei:
> 
> CREATE TABLE IF NOT EXISTS `Jahr_Standort`
> `ID` int(10) NOT NULL auto_increment,
> `DateTime` datetime NOT NULL default '0000-00-00 00:00:00',
> `IP` varchar(15) NOT NULL default '',
> `Call` varchar(20) NOT NULL default '',
> `Typ` varchar(20) NOT NULL default '',
> `Verbindungen` varchar(40) NOT NULL default '',
> `Kommentar` text NOT NULL,
> PRIMARY KEY  (`ID`),
> KEY `DateTime` (`DateTime`),
> KEY `Call` (`Call`),
> KEY `Typ` (`Typ`),
> FULLTEXT KEY `Kommentar` (`Kommentar`)
> 
> Ausgewertete Daten aus `Jahr_Standort`:
> 
> CREATE TABLE IF NOT EXISTS `Jahr_f_Standort`
> `f_id` int(10) NOT NULL auto_increment,
> `Start_ID` int(10) NOT NULL default '0',
> `End_ID` int(10) NOT NULL default '0',
> `Start_Zeit` datetime NOT NULL default '0000-00-00 00:00:00',
> `End_Zeit` datetime NOT NULL default '0000-00-00 00:00:00',
> `Call` varchar(20) NOT NULL default '',
> `Von` varchar(40) NOT NULL default '',
> `Nach` varchar(40) NOT NULL default '',
> PRIMARY KEY  (`f_id`),
> KEY `Start_ID` (`Start_ID`),
> KEY `End_ID` (`End_ID`),
> KEY `Start_Zeit` (`Start_Zeit`),
> KEY `End_Zeit` (`End_Zeit`),
> KEY `Call` (`Call`),
> KEY `Von` (`Von`),
> KEY `Nach` (`Nach`)
> 
> Meine Frage betrifft die Übernahme aus der oberen in die untere Tabelle.

Das ist vielleicht der Stichpunkt. Ich schätze ja wegen der ganzen Indizes
weniger, dass das Auslesen von Daten das Problem ist. Ich tippe viel eher
auf die Insert-Anweisungen um die Daten in die zweite Tabelle einzufügen.
Du solltest dennoch mal ebenso die SELECT-Statements mit einem
vorangestellten EXPLAIN analysieren und kontrollieren welche Indizes
verwendet werden. Ich kann dir jetzt hier nicht die Funktionalität und
Struktur von Indizes erklären, zum Einstieg würde ich dir das Buch "High
Performance MySQL" empfehlen von J. Zawodny und D. J. Balling. Leih es dir
aus oder kauf es dir - es ist nicht so teuer und es ist gut! Das Buch würde
dir sicherlich helfen. Ich vermute mal ganz stark, dass du die Indizes, so
wie du sie oben angelegt hast, auch gar nicht alle brauchst - aber das ist
so ohne Hintergrundwissen nur meine Vermutung. Beachte jedenfalls den
Hinweis von Andreas zum Deaktivieren und Aktivieren der Indizes, wenn du
viele Daten auf einmal einfügst. 

Viel Erfolg!

Gruß,
Michael


php::bar PHP Wiki   -   Listenarchive