MySQL: Einfügeprozess beschleunigen

moogwai

Grünschnabel
Hallo,

ich wollte mal nachfragen ob es irgendeine Möglichkeit gibt Einfügeprozesse in die Datenbank zu beschleunigen. Ich benutze MySQL 4.0.20 auf Windows XP (2100+, 1GB Ram) (habe es aber auch schon auf Debian mit MySQL 3.XX, 4.0.20 und 4.0.13 versucht).
Zum Thema: Ich versuche derzeit Stats für ein Spiel zu parsen, die Informationen werden dann in der Datenbank abgelegt. Pro Tag kommen etwa 3-4 XML Dateien zum parsen hinzu die ca. 8-14 mb groß sind. Meine Datanbankgröße ist inzwischen auf stolze 27mb gewachsen. Anfangs benötigte das parsen und Einfügen der Informationen einer Datei ca. 5 Minuten. Mittlerweile beträgt die Dauer jedoch 40 Minuten, davon benötigt der Einfügeprozess 38 Minuten. Ich habe mich zwar schon ein wenig umgeschaut, wie ich meine "my.cnf" editieren kann, bisher hatte ich damit aber leider keinen Erfolg. Es kann auch gut sein, daß das parsing-Tool das ich benutze, nicht gerade optimale sql-statements fürs einfügen benutzt, dies kann ich aber leider nicht überprüfen. Ich hoffe es hat irgendwer n paar Tips. Die Datenbank ist zwar schon recht groß von demher habe ich erwartet dass mit wachsender Datenbank auch die Dauer ansteigt, jedoch 40 Minuten für 12mb Daten ist denke ich doch ein wenig viel.

Hier mal meine my.cnf:
Code:
[client]
port            = 3306
socket          =D:/Programme/mysql/mysql.sock

[ mysqld]
port            = 3306
socket          = D:/Programme/mysql/mysql.sock
skip-locking
set-variable    = key_buffer=96M
set-variable    = max_allowed_packet=1M
set-variable    = table_cache=250
set-variable    = sort_buffer=512K
set-variable    = net_buffer_length=8K
set-variable    = myisam_sort_buffer_size=8M
log-bin
server-id       = 1

basedir=D:/Programme/mysql
tmpdir=D:/Programme/mysql/tmp
datadir=D:/Programme/mysql/data

# Uncomment the following if you are using BDB tables
#set-variable   = bdb_cache_size=4M
#set-variable   = bdb_max_lock=10000

[mysqldump]
quick
set-variable    = max_allowed_packet=16M

[ mysql]
no-auto-rehash

[isamchk]
set-variable    = key_buffer=20M
set-variable    = sort_buffer=20M
set-variable    = read_buffer=2M
set-variable    = write_buffer=2M

[myisamchk]
set-variable    = key_buffer=20M
set-variable    = sort_buffer=20M
set-variable    = read_buffer=2M
set-variable    = write_buffer=2M

[mysqlhotcopy]
interactive-timeout

[WinMySQLadmin]
Server=D:/Programme/mysql/bin/mysqld-nt.exe

Danke jetzt schonmal,

Gruß moogwai
 
Hallo!

MySQL bietet noch andere Möglichkeiten zum Import von Massendaten....

Code:
mysql> use test;
Database changed

Code:
mysql> create table tblTest(spalte1 varchar(30), spalte2 varchar(30), spalte3 va
rchar(30));
Query OK, 0 rows affected (0.09 sec)

Code:
Dump im Verzeichniss c:\dumps (~ 400 MB)
08.08.2004  15:07          388.138.227 dump.dat

Auszug aus dem Inhalt von dump.dat:

Code:
Hallo1079,Hallo1128,Hallo386
Hallo607,Hallo1441,Hallo1208
Hallo316,Hallo206,Hallo22
Hallo627,Hallo487,Hallo697
Hallo1329,Hallo1284,Hallo1377
Hallo876,Hallo392,Hallo834
Hallo265,Hallo989,Hallo1526
Hallo1050,Hallo1372,Hallo1305
Hallo330,Hallo248,Hallo572
Hallo1605,Hallo71,Hallo494
Hallo1205,Hallo187,Hallo466
Hallo612,Hallo793,Hallo115
Hallo900,Hallo1815,Hallo210
Hallo749,Hallo576,Hallo500
Hallo268,Hallo902,Hallo936
Hallo177,Hallo436,Hallo831
Hallo1289,Hallo51,Hallo146
Hallo1705,Hallo1065,Hallo439


Code:
mysql> LOAD DATA INFILE 'c:/dumps/dump.dat' INTO TABLE tblTest FIELDS TERMINATED
 BY ',';
Query OK, 9999999 rows affected (58.72 sec)
Records: 9999999  Deleted: 0  Skipped: 0  Warnings: 0

Mein System P4 2,6 GHz, 512 MB Ram

HTH
Gruß Tom
 
Erst mal vielen Dank für die schnelle Antwort Thomas. Ich denke jedoch, daß dies in meinem Fall nicht helfen wird, da ich ja ein Tool benutze welches mir die XML-Dateien parst und nach dem Parsen diese in die Datenbank schreibt. Das Tool für die Stats-Erstellung heisst "selectbf". Ich habe gelesen dass man einen anonymen Checkout machen kann, was ich später dann auch mal versuchen werde um mir den Source-Code genauer anzuschauen.
Ich habe mir auch schon überlegt die vorhandene Datenbank zu exportieren und mit einer leeren Datenbank neu anzufangen und die beiden danach wieder versuchen zusammenzufügen. Dieser Vorgang wird jedoch meiner Meinung nicht funktionieren, da die Primary Keys usw. dann doppelt vergeben wären und MySQL bestimmt Fehler melden würde. Da die Datenbank (für mich) recht komplex aufgebaut ist (28 Tabellen) fehlt mir auch der nötige Überblick um herauszubekommen wie ich am besten eine Lösung finden könnte.

Mich macht es nur ein wenig stuzig, daß eine Dump-File so schnell importiert werden kann, eine 12mb Datei jedoch so lange braucht um einzelne Statements einzufügen.
Es kann natürlich sein dass mir dein Vorschlag hilft, nur habe ich dann wohl ne Kleinigkeit nicht verstanden :)

Nochmals Danke für die schnelle Antwort.

Gruß moogwai
 
Zurück