Ich habe kürzlich entdeckt, dass MySQL eine "Speicher" -Engine hat, die mir nicht bekannt war (der Großteil meiner Datenbankarbeit ist für Hobbyprojekte bestimmt, also lerne ich, was ich brauche, wenn ich gehe). Anscheinend sollte diese Option zu einer drastisch verbesserten Leistung führen. Ich frage mich daher, ob dies mit Nachteilen verbunden ist. Die beiden, die ich kenne, sind:
- Ich muss über genügend RAM verfügen, um die fraglichen Tische aufnehmen zu können.
- Die Tabellen gehen verloren, wenn die Maschine herunterfährt.
Ich glaube, # 1 sollte kein Problem sein, da ich AWS EC2 verwende und bei Bedarf auf einen Instanztyp mit mehr Arbeitsspeicher umsteigen kann. Ich glaube, ich kann # 2 lindern, indem ich nach Bedarf auf die Festplatte zurückspeichere.
Welche anderen Probleme gibt es? Kann die Speicher-Engine jemals eine schlechtere Leistung liefern als MyISAM oder InnoDB? Ich glaube, ich habe etwas gelesen, bei dem die Indizes bei dieser Engine anders sind. Muss ich mir darüber Sorgen machen?
quelle
Es gibt viele Fälle, in denen die Speicher-Engine nicht verwendet wird - und in denen InnoDB schneller ist. Sie müssen nur über Parallelitätstests nachdenken und nicht über triviale Einzelthread-Tests.
Wenn Sie über einen ausreichend großen Pufferpool verfügen, wird InnoDB auch für Leseoperationen vollständig speicherresident. Datenbanken haben Caches . Sie wärmen sich auf!
Unterschätzen Sie auch nicht den Wert von Sperren auf Zeilenebene und MVCC (Leser blockieren keine Schreiber). Es kann "langsamer" sein, wenn Schreibvorgänge auf der Festplatte bestehen bleiben müssen. Aber zumindest werden Sie während dieser Schreiboperation nicht blockieren, wie Sie es bei einer Speichertabelle tun würden (kein MVCC; Sperren auf Tabellenebene).
quelle
Für die Aufzeichnung. Ich habe Mysql-Tabellen im Speicher getestet, um einige Informationen zu speichern. Und ich habe PHPs APC (APCu) getestet, um die gleichen Informationen zu speichern.
Für 58000 Registrierungen. (varchar + integer + date).
Die Tabelle hat nur einen einzigen Index, daher denke ich nicht, dass dies der Hauptfaktor ist.
Fazit:
Speichertabelle ist keine Option für "große" Tabellen, da zu viel Speicher verwendet wird.
quelle
"MEMORY tables use a fixed-length row-storage format. Variable-length types such as VARCHAR are stored using a fixed length."
dev.mysql.com/doc/refman/5.6/en/memory-storage-engine.html Es scheint, als würde VARCHAR mit der MEMORY-Engine zu CHAR.Der andere Nachteil der MEMORY-basierten Tabellen besteht darin, dass sie nicht mehrmals in derselben Abfrage referenziert werden können. Zumindest wurde dieses Verhalten bis zur v5.4 gefunden. Wie bei CTEs (seit v8.x) ist es nicht erforderlich, mem-basierte Zwischentabellen für komplexe Prozeduren zu verwenden.
quelle
Gemäß den MySQL- und MariaDB-Handbüchern werden BLOB und CLOB (verschiedene TEXT-Typen) vom MEMORY-Speicher nicht unterstützt. Für unsere eigenen Zwecke machte dies die Speicher-Engine MEMORY fast unbrauchbar.
http://dev.mysql.com/doc/refman/5.7/en/memory-storage-engine.html
https://mariadb.com/kb/en/mariadb/memory-storage-engine/
Bei dem Versuch, nur einen Teil der Datenbank in den MEMORY-Speicher zu konvertieren, wurde festgestellt, dass Fremdschlüssel zwischen den Speichermodulen nicht unterstützt werden. Alle Tabellen, die Fremdschlüsselverweise auf die Tabellen mit BLOB / CLOB enthalten sollten, sollten sich also auch in Speichertypen ohne Arbeitsspeicher befinden (zumindest betrifft dies InnoDB-untergeordnete Tabellen).
quelle
MEMORY-Tabellen sind nicht für die dauerhafte Speicherung gedacht, insbesondere nicht für große Datenmengen oder alles, wo die Aufbewahrung kritisch ist. Meiner Erfahrung nach besteht der beste Zweck darin, vorübergehende Datensätze während der Erstellung und Auffüllung temporärer Tabellen während komplexer Prozeduren zu speichern. Dies ist erheblich schneller als bei den meisten anderen Tabellentypen für diesen Zweck, vorausgesetzt, Ihr Schlüsselpufferschwellenwert für die Engine ist hoch genug, um nicht aufzutreten eine Festplatte schreiben. Dies kann zu diesem Zweck eine Größenordnung schneller als MyISAM oder InnoDB ausgeführt werden, da keine Platten-E / A vorhanden sind. Bei einer Tabelle, die in einer bestimmten Prozedur eingekapselt ist, sind Indexierung und Relationen weniger wichtig als sie würde wo Ausdauer erwartet wird.
quelle
Zusätzlich zu den vorherigen Antworten. direkt aus dem MySQL 5.7 Handbuch:
"Die Leistung von MEMORY wird durch Konflikte eingeschränkt, die sich aus der Ausführung eines einzelnen Threads und dem Overhead der Tabellensperre bei der Verarbeitung von Aktualisierungen ergeben. Dies schränkt die Skalierbarkeit ein, wenn die Auslastung zunimmt, insbesondere bei Anweisungsmischungen, die Schreibvorgänge enthalten."
... und das ist eine sehr reale Einschränkung. Beispiel: Wenn Sie in mehreren Sitzungen versuchen, schöne, schnelle temporäre MEMORY-Tabellen zu erstellen, kann das Single-Threading einen schwerwiegenden Leistungsengpass verursachen.
quelle