it-swarm.com.de

Wie kann ich eine MySQL-Datenbank vollständig im Arbeitsspeicher ausführen lassen?

Ich habe festgestellt, dass mein Datenbankserver die Speicherdatenbankengine unterstützt. Ich möchte, dass eine Datenbank, auf der InnoDB ausgeführt wird, bereits vollständig im Arbeitsspeicher ausgeführt wird.

Wie mache ich das? Ich habe PHPMyAdmin erforscht und finde keine "Change Engine" -Funktion.

36
John Hoffman

Vorausgesetzt, Sie verstehen die Konsequenzen der Verwendung der MEMORY-Engine, wie in den Kommentaren erwähnt, und hier sowie einige andere, die Sie beim Durchsuchen finden (keine Transaktionssicherheit, Probleme beim Sperren usw.) -, können Sie folgendermaßen vorgehen :

MEMORY-Tabellen werden anders als InnoDB gespeichert, daher müssen Sie eine Export-/Importstrategie verwenden. Sichern Sie zuerst jede Tabelle separat mit SELECT * FROM tablename INTO OUTFILE 'table_filename' in eine Datei. Erstellen Sie die MEMORY-Datenbank und erstellen Sie die Tabellen, die Sie mit dieser Syntax verwenden, neu: CREATE TABLE tablename (...) ENGINE = MEMORY;. Anschließend können Sie Ihre Daten mit LOAD DATA INFILE 'table_filename' INTO TABLE tablename für jede Tabelle importieren.

20
PinnyM

Es ist auch möglich, das MySQL-Datenverzeichnis in einem tmpfs zu platzieren, um die Schreib- und Leseaufrufe der Datenbank zu beschleunigen. Dies ist möglicherweise nicht der effizienteste Weg, aber manchmal kann man nicht einfach die Speicher-Engine ändern. 

Hier ist mein fstab-Eintrag für mein MySQL-Datenverzeichnis

none            /opt/mysql/server-5.6/data  tmpfs   defaults,size=1000M,uid=999,gid=1000,mode=0700          0       0

Ich habe auch einen Beitrag geschrieben, der das Setup näher erläutert. Ich benutze dieses Setup für Datenbank-Tests.

http://jotschi.de/2014/02/03/high-performance-mysql-testdatabase/

Möglicherweise möchten Sie auch die Einstellung innodb_flush_log_at_trx_commit = 2 betrachten. Vielleicht beschleunigt dies Ihr MySQL-System ausreichend. 

innodb_flush_log_at_trx_commit ändert das Flush-Verhalten von mysql-Festplatten. Bei der Einstellung 2 wird der Puffer nur jede Sekunde geleert. Standardmäßig führt jedes Insert zu einem Flush und somit zu mehr IO - Last.

14
Jotschi

Die Memory Engine ist nicht die Lösung, die Sie suchen. Sie verlieren alles, wofür Sie überhaupt in eine Datenbank gegangen sind (d. H. ACID).

Hier sind einige bessere Alternativen:

  1. Verwenden Sie keine Joins - dies tun nur wenige große Apps (d. H. Google, Flickr, NetFlix), da sie große Mengen von Joins zulassen. 

Ein LINKS [OUTER] JOIN kann schneller als eine entsprechende Unterabfrage sein, da Der Server kann es möglicherweise besser optimieren - eine Tatsache, die nicht .__ ist. spezifisch für MySQL Server allein.

- Das MySQL-Handbuch

  1. Stellen Sie sicher, dass die Spalten, die Sie abfragen, über Indizes verfügen. Verwenden Sie EXPLAIN, um zu bestätigen, dass sie verwendet werden.
  2. Verwenden und erhöhen Sie Ihren Query_Cache und den Speicherplatz für Ihre Indizes, um sie in den Arbeitsspeicher zu laden und häufige Suchvorgänge zu speichern.
  3. Denormalisieren Sie Ihr Schema, insbesondere für einfache Joins (d. H. FooId von barMap erhalten).

Der letzte Punkt ist der Schlüssel. Früher liebte ich Joins, musste aber Joins an einigen Tabellen mit 100M + Zeilen ausführen. Nicht gut. Fügen Sie die Daten, mit denen Sie sich verbinden, besser in diese Zieltabelle ein (wenn dies nicht zuviel ist) und führen Sie eine Abfrage nach indizierten Spalten durch, und Ihre Abfrage wird in wenigen ms angezeigt.

Ich hoffe die helfen.

9
Joseph Lust

Wenn Ihre Datenbank klein genug ist (oder wenn Sie genügend Arbeitsspeicher hinzufügen), wird Ihre Datenbank effektiv im Arbeitsspeicher ausgeführt, da Ihre Daten nach der ersten Anforderung zwischengespeichert werden. 

Das Ändern der Datenbanktabellendefinitionen zur Verwendung der Memory Engine ist wahrscheinlich komplizierter als Sie benötigen.

Wenn Sie über genügend Arbeitsspeicher verfügen, um die Tabellen mit der MEMORY-Engine in den Arbeitsspeicher zu laden, können Sie die innodb-Einstellungen so anpassen, dass ohnehin alles zwischengespeichert wird.

7
Kevin Bedell

"Wie mache ich das? Ich habe PHPMyAdmin ausprobiert und kann keine" Change Engine "-Funktion finden."

Als direkte Antwort auf diesen Teil Ihrer Frage können Sie einen ALTER TABLE tbl engine=InnoDB; ausgeben, und die Tabelle wird in der entsprechenden Engine neu erstellt.

4
Seaux

Anstelle der Memory-Speicher-Engine kann man MySQL Cluster in Betracht ziehen. Es wird gesagt, dass es eine ähnliche Leistung bietet, aber den Betrieb mit Festplattenunterstützung für Haltbarkeit unterstützt. Ich habe es nicht ausprobiert, aber es sieht vielversprechend aus (und war seit einigen Jahren in der Entwicklung).

Die offizielle Dokumentation zu MySQL Cluster finden Sie hier.

2
Jice

Zusätzliche Gedanken:

Ramdisk - Einstellung des temporären Laufwerks, das MySQL als RAM -Datenträger verwendet, sehr einfach einzurichten.

memcache - Der memcache-Server ist einfach einzurichten. Verwenden Sie ihn, um die Ergebnisse Ihrer Abfragen X-Zeit lang zu speichern.

0
Mike Q