340 MySQL - Technische Referenz f¨ur Version 5.0.1-alpha
• Schließen: (1)
Wobei die Zahlen in etwa proportional zur Gesamtzeit sind. Diese Berechnung zieht den
anf¨anglichen Overhead, um Tabellen zu ¨offnen, nicht in Betracht (was einmal f¨ur jede
gleichzeitig laufende Anfrage gemacht wird).
Die Gr¨oße der Tabelle verlangsamt das Einf¨ugen von Indexen um N log N (B-B¨aume).
Einige M¨oglichkeiten, die Geschwindigkeit von Einf¨ugeoperationen zu steigern:
• Wenn Sie viele Zeilen vom selben Client aus zur gleichen Zeit einf¨ugen, benutzen Sie
mehrfache Werte (Liste) im INSERT-Statements. Das geht viel schneller (in manchen
F¨alle um Faktoren) als separate INSERT-Statements zu benutzen. Tunen Sie die
myisam_bulk_insert_tree_size-Variable, um das sogar noch zu beschleunigen.
Siehe Abschnitt 5.5.5.4 [SHOW VARIABLES], Seite 249.
• Wenn Sie viele Zeilen von unterschiedlichen Clients aus einf¨ugen, k¨onnen Sie mehr
Geschwindigkeit erzielen, wenn Sie das INSERT DELAYED-Statement benutzen. Siehe
Abschnitt 7.4.3 [INSERT], Seite 442.
• Beachten Sie, dass Sie mit MyISAM-Tab ellen Zeilen zur selben Zeit einf¨ugen k¨onnen, zu
der SELECTs laufen, wenn es keine gel¨oschten Zeilen in den Tabellen gibt.
• Wenn Daten in eine Tabelle aus einer Textdatei eingeladen werden, benutzen Sie LOAD
DATA INFILE. Das ist ¨ublicherweise 20 mal schneller als viele INSERT-Statements zu
benutzen. Siehe Abschnitt 7.4.9 [LOAD DATA], Seite 448.
• Mit etwas zus¨atzlicher M¨uhe ist es m¨oglich, LOAD DATA INFILE noch schneller laufen
zu lassen, wenn die Tabelle viele Indexe hat. Gehen Sie wie folgt vor:
1. Optional erzeugen Sie die Tabelle mit CREATE TABLE, zum Beispiel mit mysql oder
¨uber die Perl-DBI.
2. F¨uhren Sie ein FLUSH TABLES-Statement oder den Shell-Befehl mysqladmin flush-
tables aus.
3. Geben Sie myisamchk --keys-used=0 -rq /pfad/zu/db/tabelle ein. Dadurch
entfernen Sie die Benutzung aller Indexe von der Tabelle.
4. F¨ugen Sie Daten in die Tabelle mit LOAD DATA INFILE ein. Dadurch werden keine
Indexe aktualisiert, was deswegen sehr schnell l¨auft.
5. Wenn Sie in Zukunft nur noch aus der Tabelle lesen, benutzen Sie myisampack,
um sie kleiner zu machen. Siehe Abschnitt 8.1.2.3 [Compressed format], Seite 488.
6. Erzeugen Sie die Indexe mit myisamchk -r -q /pfad/zu/db/tabelle neu.
Hierdurch wird der Index-Baum im Speicher erzeugt, bevor er auf die Platte
geschrieben wird, was viel schneller ist, weil viele Suchvorg¨ange auf Platte
vermieden werden. Der sich ergebende Index-Baum ist ausserdem perfekt
ausbalanciert.
7. F¨uhren Sie ein FLUSH TABLES-Statement oder den Shell-Befehl mysqladmin flush-
tables aus.
Diese Prozedur wird in Zukunft in LOAD DATA INFILE eingebaut werden.
Ab MySQL 4.0 k¨onnen Sie auch ALTER TABLE tabelle DISABLE KEYS anstelle von
myisamchk --keys-used=0 -rq /pfad/zu/db/tabelle und ALTER TABLE tabelle
ENABLE KEYS anstelle von myisamchk -r -q /pfad/zu/db/tabelle benutzen. Damit
k¨onnen Sie auch die FLUSH TABLES-Schritte ¨uberspringen.
Comentarios a estos manuales