PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : mySQL Datenbank optimieren: Datenbank auf RAM auslagern möglich?


Weyoun
2013-04-17, 20:15:35
Hi,

ich erstelle gerade mit einem bash-script eine Reihe von Datensätzen, die ich per mysql Befehl "INSERT INTO ..." in eine mysql datenbank reinschreiben möchte.
Ich habe es jetzt so gemacht, dass alle mysql befehle in einem bash string stecke und diese schicke ich dann in einem einzigen Aufruf an die Datenbank.

Mein Problem ist, es dauert mehrere Minuten bis mysql meine 10k "INSERT INTO..." Befehle abgearbeitet hat. Ich sehe dabei meine Festplatte während des mysql Aufrufes konstant leuchten. Das Problem ist nicht das bash-script, das Problem ist das mysql Programm selbst.

Er bleibt im script an folgender Zeile für einige Minuten stecken:

echo -e "$sql_commands" | mysql -uUSER -pPW

wobei $sql_commands ein String mit ca. 10.000 SQL-Befehlen ist.

Ich bin noch ziemlich neu was mySQL-Datenbanken angeht und frage mich ob ich das nicht irgendwie mit einer Option steigern kann, indem ich die Datenbank vorläufig auf den Arbeitsspeicher auslagern kann. Das ist während der Entwicklungsphase aus Sicherheitsgründen nur temporär, würde mir aber während des Codens viel Wartezeit sparen.

Auf eine RAMDISK auslagern habe ich mir schon angeschaut. (Link: http://tomislavsantek.iz.hr/2011/03/moving-mysql-databases-to-ramdisk-in-ubuntu-linux/)
Werde ich wohl machen, wenn es keine andere Option gibt. Hätte vermutet, das man bei mysql in einer .conf oder einer flag irgendwas einstellen kann.

Bin in mysql noch Anfänger, sicherlich habe ich irgendwas übersehen. Wäre für Hinweise sehr dankbar.

PatkIllA
2013-04-17, 20:29:11
MySQL hat selbst eine Engine für in Memory Datenbanken. (CREATE TABLE foobar ENGINE=MEMORY; )

Welche Datenbank Engine verwendest du? Bei innoDB solltest du das ganze in eine Transaction packen.
Ansonsten kannst du auch die Datenbank anhalten und die Datei sichern.
Dann kannst du sie später wieder anhalten, die Datei zurückkopieren und sie wieder starten.

Du könntest auch mysqldump verwenden.

Du kannst die Insert Statements als StoredProcedures speichern und dann mit den Parametern füttern.

Und abgesehen davon willst du einfach eine SSD ;)

TongPo
2013-04-17, 22:57:18
2 sachen:

* lieber ein insert mit 10k zeilen machen als 10k einzelne inserts
* load data infile ist sehr viel schneller (http://dev.mysql.com/doc/refman/5.6/en/load-data.html)

wenn das an geschwindigkeit immernoch nicht reicht, kann man den mysql data folder auch in eine ramdisk legen. 10k datensätze sollten aber eigentlich auch so flutschen.

Weyoun
2013-04-18, 10:22:54
Super, danke an euch beide. Mit euren Tipps bin ich draufgekommen, dass man ENGINE = MEMORY statt innoDB in mysql-workbench setzen kann. Jetzt dauert das ganze statt 3 Minuten nur noch 4 Sekunden.

Load Data Infile wäre dann das nächste was ich bei den größeren Blöcken in meinem script machen werde. Dürfte schneller als bash strings sein.

registrierter Gast
2013-04-18, 16:46:25
Angestachelt durch diesen Thread, wollte ich die Datenbank für mein lokales DEV System ebenfalls von der InnoDB- auf die memory-Engine umstellen. Er meckerte dann aber schnell, dass Blobs und Texte nicht supported werden.


Also habe ich mal den Tipp mit der Ramdisk ausprobiert. (Ich nahm diesen Link: http://icephoenix.us/stuff/how-to-move-mysql-storage-to-ramfs-or-tmpfs-partition/)

Und siehe da. Schon das Einspielen des 150MB Dumps dauerte nur noch 18s (vorher 38s bei einer SSD, meine Kollegen mit ihrer HDD brauchen ~90s). Auch die Applikation reagiert nun spürbar (!) schneller. :cool:

registrierter Gast
2013-04-19, 11:09:09
Und nun habe ich es einfach noch so gemacht, dass beim Runterfahren und Neustart einfach der Inhalt der Ramdisk backupped wird und beim Start dann wieder zurück in die Ramdisk geschrieben wird. :freak:
So habe ich am Morgen den gleichen Datenbestand wie am Vorabend.

PatkIllA
2013-04-19, 11:10:06
Und nun habe ich es einfach noch so gemacht, dass beim Runterfahren und Neustart einfach der Inhalt der Ramdisk backupped wird und beim Start dann wieder zurück in die Ramdisk geschrieben wird. :freak:
So habe ich am Morgen den gleichen Datenbestand wie am Vorabend.
Mach doch einfach Standby oder Ruhezustand. Dann kan man sogar an der genau gleichen Stelle weiterarbeiten. Ich mache öfters im Breakpoint Feierabend.

littlejam
2013-04-26, 22:54:56
Es gibt bei MySQL wirklich einen Sack voll Tuningmöglichkeiten und Auslagern auf eine Ramdisk oder eine Memory-Table ist IMHO eine der schlechtesten, da dadurch jeglicher Bezug zur Realität verloren geht.
Code/Konzepte die im Ram noch ordentlich laufen, laufen im Livesystem dann nicht mehr.

Hier gibts einen Einstieg, woran man drehen könnte...
http://www.ilsistemista.net/index.php/linux-a-unix/26-mysql-performance-tuning.html?start=4

Gruß