Ein bisschen spät dran... aber hier ist eine recht umfassende Beitrag, den ich vor ein paar Monaten geschrieben habe in dem die wichtigsten Unterschiede zwischen MYISAM und InnoDB erläutert werden. Nehmen Sie sich eine Tasse Tee (und vielleicht einen Keks) und genießen Sie.
Der Hauptunterschied zwischen MyISAM und InnoDB liegt in der referenziellen Integrität und den Transaktionen. Darüber hinaus gibt es weitere Unterschiede wie Sperren, Rollbacks und Volltextsuche.
Referentielle Integrität
Die referentielle Integrität stellt sicher, dass die Beziehungen zwischen den Tabellen konsistent bleiben. Konkret bedeutet dies, dass, wenn eine Tabelle (z. B. Listings) einen Fremdschlüssel (z. B. Product ID) hat, der auf eine andere Tabelle (z. B. Products) verweist, bei Aktualisierungen oder Löschungen in der Tabelle, auf die verwiesen wird, diese Änderungen kaskadenartig auf die verknüpfende Tabelle übertragen werden. Wenn in unserem Beispiel ein Produkt umbenannt wird, werden die Fremdschlüssel der verknüpfenden Tabelle ebenfalls aktualisiert; wenn ein Produkt aus der Tabelle "Produkte" gelöscht wird, werden alle Einträge, die auf den gelöschten Eintrag verweisen, ebenfalls gelöscht. Außerdem muss jeder neue Eintrag einen Fremdschlüssel haben, der auf einen gültigen, bestehenden Eintrag verweist.
InnoDB ist ein relationales DBMS (RDBMS) und verfügt daher über referentielle Integrität, während MyISAM dies nicht tut.
Transaktionen und Atomarität
Die Daten in einer Tabelle werden mit Data Manipulation Language (DML)-Anweisungen wie SELECT, INSERT, UPDATE und DELETE verwaltet. Eine Transaktion fasst zwei oder mehr DML-Anweisungen zu einer einzigen Arbeitseinheit zusammen, so dass entweder die gesamte Einheit angewendet wird oder nichts davon.
MyISAM unterstützt keine Transaktionen, InnoDB hingegen schon.
Wenn ein Vorgang unterbrochen wird, während eine MyISAM-Tabelle verwendet wird, wird der Vorgang sofort abgebrochen, und die betroffenen Zeilen (oder sogar die Daten in jeder Zeile) bleiben betroffen, auch wenn der Vorgang nicht zu Ende geführt wurde.
Wenn eine Operation unterbrochen wird, während eine InnoDB-Tabelle verwendet wird, weil sie Transaktionen verwendet, die atomisiert sind, wird jede Transaktion, die nicht abgeschlossen wurde, nicht wirksam, da keine Übergabe erfolgt.
Tabellenverriegelung vs. Zeilenverriegelung
Wenn eine Abfrage gegen eine MyISAM-Tabelle läuft, wird die gesamte Tabelle, in der sie abgefragt wird, gesperrt. Das bedeutet, dass nachfolgende Abfragen erst dann ausgeführt werden, wenn die aktuelle Abfrage beendet ist. Wenn Sie eine große Tabelle lesen und/oder es häufige Lese- und Schreibvorgänge gibt, kann dies einen großen Rückstau an Abfragen bedeuten.
Wenn eine Abfrage auf eine InnoDB-Tabelle läuft, werden nur die betroffenen Zeilen gesperrt, der Rest der Tabelle bleibt für CRUD-Operationen verfügbar. Das bedeutet, dass Abfragen gleichzeitig auf derselben Tabelle ausgeführt werden können, sofern sie nicht dieselbe Zeile verwenden.
Diese Funktion in InnoDB wird als Gleichzeitigkeit bezeichnet. So großartig die Gleichzeitigkeit auch ist, es gibt einen großen Nachteil, der für eine Reihe ausgewählter Tabellen gilt: Es gibt einen Overhead beim Umschalten zwischen Kernel-Threads, und Sie sollten ein Limit für die Kernel-Threads festlegen, um zu verhindern, dass der Server zum Stillstand kommt.
Transaktionen und Rollbacks
Wenn Sie eine Operation in MyISAM ausführen, werden die Änderungen übernommen; in InnoDB können diese Änderungen rückgängig gemacht werden. Die gängigsten Befehle zur Steuerung von Transaktionen sind COMMIT, ROLLBACK und SAVEPOINT. 1. COMMIT - Sie können mehrere DML-Operationen schreiben, aber die Änderungen werden nur gespeichert, wenn ein COMMIT ausgeführt wird 2. ROLLBACK - Sie können alle Operationen verwerfen, die noch nicht übertragen wurden 3. SAVEPOINT - legt einen Punkt in der Liste der Operationen fest, zu dem eine ROLLBACK-Operation zurückgehen kann
Verlässlichkeit
MyISAM bietet keine Datenintegrität - Hardwareausfälle, unsauberes Herunterfahren und abgebrochene Operationen können dazu führen, dass die Daten beschädigt werden. Dies würde eine vollständige Reparatur oder einen Neuaufbau der Indizes und Tabellen erfordern.
InnoDB hingegen verwendet ein Transaktionsprotokoll, einen doppelten Schreibpuffer und eine automatische Prüfsummenbildung und Validierung, um Korruption zu verhindern. Bevor InnoDB Änderungen vornimmt, zeichnet es die Daten vor den Transaktionen in einer System-Tablespace-Datei namens ibdata1 auf. Im Falle eines Absturzes würde InnoDB durch die Wiedergabe dieser Protokolle eine automatische Wiederherstellung vornehmen.
FULLTEXT-Indizierung
InnoDB unterstützt die FULLTEXT-Indizierung erst ab MySQL-Version 5.6.4. Zum Zeitpunkt der Erstellung dieses Beitrags liegt die MySQL-Version vieler Shared-Hosting-Anbieter noch unter 5.6.4, was bedeutet, dass FULLTEXT-Indexierung für InnoDB-Tabellen nicht unterstützt wird.
Dies ist jedoch kein triftiger Grund, MyISAM zu verwenden. Wechseln Sie am besten zu einem Hosting-Anbieter, der aktuelle Versionen von MySQL unterstützt. Eine MyISAM-Tabelle, die FULLTEXT-Indizierung verwendet, kann nicht in eine InnoDB-Tabelle konvertiert werden.
Schlussfolgerung
Zusammenfassend lässt sich sagen, dass InnoDB die Standard-Speicher-Engine Ihrer Wahl sein sollte. Entscheiden Sie sich für MyISAM oder andere Datentypen, wenn sie einen bestimmten Bedarf erfüllen.
14 Stimmen
Le MySQL-Leistungs-Blog ist eine großartige Quelle für diese Art von Dingen.
3 Stimmen
Dies hängt ein wenig davon ab, ob Ihr System OLTP- oder eher Datawarehouse-orientiert ist (wo die meisten Schreibvorgänge in großen Mengen erfolgen).
38 Stimmen
MyISAM unterstützt kein Row-Locking, keine Transaktionen, es unterstützt nicht einmal Fremdschlüssel... verdammt, da es keine SÄURE kann man kaum noch von einer richtigen Datenbank sprechen! Das ist der Grund, warum InnoDB seit MySQL 5.5 die Standard-Engine ist... aber, aus welchem Grund auch immer, ist MyISAM weiterhin die Standard-Engine für Tabellen, die mit PhpMyAdmin erstellt werden, so dass viele Amateur-Datenbanken seitdem auf MyISAM laufen.
0 Stimmen
Siehe dies rackspace.com/knowledge_center/article/
0 Stimmen
Alle sehen MySql DB-Engines verglichen
0 Stimmen
Ich habe es gerade mit einer 80.0000 Datensätze umfassenden Datenbank getestet. MyIsam ist um Sekunden schneller.