Mailinglisten-Archive |
Hallo Tobias, rein aus dem Bauch heraus würde ich hier folgendes vorschlagen: Wie es scheint gibt es einen Input-Bereich und einen Lager-Bereich. Im Input Bereich fallen Daten an nach einem Aufräumen in den Lager-Bereich überführt werden müssen. Also würde ich den Input Bereich so gestalten das er in möglichst für das Aufräume greifbare Blöcke zerlegt wird und die Aufräumarbeiten in dem Input Bereich noch überschaubar bleiben. z.B. - pro Tag eine Tabelle - am Ende es Tages die Tabelle aufräumen und Daten in Lager-Tabelle schreiben - nicht verarbeitete Daten (weil noch nicht aufräumbar) verschiebe ich in die aktuelle Tagestabelle - usw. Damit halte ich den Input Bereich klein, was ich aufräumen kann Räum ich auf, was nicht verarbeitbar ist verschiebe ich auf den nächsten Zyklus. "Tag" kann man nun auch als 2 Tage, Woche, Monat o.ä. auffassen. Das Aufräumen, Übertragen in Lagertabelle und Säubern des Input Bereiches muss dabei aber in einer Transaktion ablaufen - sprich MyISAM als Storage Engine fällt da aus. Daher würde ich hier (vor allem bei den Datenmengen) auf InnoDB setzen. Eine schönen fetten Datenbankserver nehmen (ordentlich CPU, viel RAM und vor allem sehr schnelle Platten) und dem InnoDB ordentlich Platz (auto extend bremst extrem also lieber gleich auf Partition schrieben lassen oder ordentlich große Tablespace Dateien anlegen) und RAM geben. Evtl. reicht es wenn man den Input Bereich auf InnoDB fährt und die Lager-Tabellen auf MyISAM aber das müsste man in der Praxis sehen wie sich auch Abfragen gestalten denn: Fahre ich zwei vollausgebaute Storage-Engines in MySQL brauch ich für bei jeweils viel RAM denn die Buffer, Caches etc. gehören der jeweiligen Storage Engine. Noch kurz zum Aufräumen: Das Aufräumen nach der Methode von Sebastian ist wesentlich schneller als der Subselect - da hat sich zwar in den 5er Versionen viel am optimizer getan aber so richtig herausoptimieren von solchen Abfragen klappt noch nicht ganz. Bei meinem Vorschlag würde das ganze sogar nochmals vereinfach weil man hier direkt auf einen Inner-Join setzen kann: INSERT INTO lager_tabelle(felder....) SELECT felder.... FROM Tabelle1 INNER JOIN Tabelle2 ON Tabelle2.ID=Tabelle1.ID INNER JOIN Tabelle3 ON Tabelle3.ID=Tabelle2.ID Schneller geht das dann nun wirklich nicht :-) Gruß, Andreas _______________________________________________ Allgemeine Infos zur Liste: http://www.4t2.com/mysql/ Verwaltung: https://lists.4t2.com/cgi-bin/mailman/listinfo/mysql-de
php::bar PHP Wiki - Listenarchive