Was sind die Hauptunterschiede zwischen InnoDB und MyISAM?
Was sind die Hauptunterschiede zwischen InnoDB und MyISAM?
Antworten:
Der erste große Unterschied ist, dass InnoDB eine Sperre auf Zeilenebene implementiert, während MyISAM nur eine Sperre auf Tabellenebene ausführen kann. In InnoDB finden Sie eine bessere Wiederherstellung nach einem Absturz. Es hat jedoch keine FULLTEXT
Suchindizes bis v5.6, ebenso wie MyISAM. InnoDB implementiert auch Transaktionen, Fremdschlüssel und Beziehungsbeschränkungen, MyISAM jedoch nicht.
Die Liste kann noch etwas weiter gehen. Beide haben jedoch ihre einzigartigen Vor- und Nachteile. Jeder von ihnen ist in einigen Szenarien besser geeignet als der andere.
Also um zusammenzufassen ( TL; DR ):
FULLTEXT
Suchindizes, InnoDB erst mit MySQL 5.6 (Feb 2013).version 5.6.4
InnoDB unterstützt FULLTEXT
Suche. dev.mysql.com/doc/refman/5.6/en/fulltext-restrictions.html
Ein weiterer wichtiger Unterschied, der noch nicht erwähnt wurde, besteht darin, wie das Caching für jede Speicher-Engine durchgeführt wird.
Der Hauptmechanismus ist der Schlüssel-Cache. Es werden nur Indexseiten aus .MYI-Dateien zwischengespeichert. Führen Sie die folgende Abfrage aus, um die Größe Ihres Schlüsselcaches zu ändern:
SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.4999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1))
recommended_key_buffer_size FROM
(SELECT LEAST(POWER(2,32),KBS1) KBS
FROM (SELECT SUM(index_length) KBS1
FROM information_schema.tables
WHERE engine='MyISAM' AND
table_schema NOT IN ('information_schema','mysql')) AA ) A,
(SELECT 2 PowerOf1024) B;
Dies gibt die empfohlene Einstellung für den MyISAM-Schlüsselcache ( key_buffer_size ) in Anbetracht Ihres aktuellen Datensatzes an ( die Abfrage begrenzt die Empfehlung auf 4 GB (4096 MB). Für 32-Bit-Betriebssysteme sind 4 GB die Obergrenze. Für 64-Bit-Betriebssysteme 8 GB.
Der Hauptmechanismus ist der InnoDB-Pufferpool. Es werden Daten und Indexseiten aus InnoDB-Tabellen zwischengespeichert, auf die zugegriffen wird. Führen Sie die folgende Abfrage aus, um die Größe Ihres InnoDB-Pufferpools zu bestimmen:
SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.49999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1)) recommended_innodb_buffer_pool_size
FROM (SELECT SUM(data_length+index_length) KBS FROM information_schema.tables
WHERE engine='InnoDB') A,
(SELECT 2 PowerOf1024) B;
Dies gibt die empfohlene Einstellung für die Größe des InnoDB- Pufferpools ( innodb_buffer_pool_size ) in Anbetracht Ihres aktuellen Datensatzes an.
Vergessen Sie nicht, die InnoDB-Protokolldateien (ib_logfile0 und ib_logfile1) in der Größe anzupassen. MySQL Source Code setzt eine Obergrenze der kombinierten Größen aller InnoDB-Protokolldateien auf <4 GB (4096 MB). Der Einfachheit halber können Sie bei nur zwei Protokolldateien die folgenden Größen festlegen:
service mysql stop
rm /var/log/mysql/ib_logfile[01]
service mysql start
(ib_logfile0 und ib_logfile1 werden neu erstellt)Am Ende beider Abfragen befindet sich eine Inline-Abfrage
(SELECT 2 PowerOf1024)
B
(SELECT 0 PowerOf1024)
gibt die Einstellung in Bytes an(SELECT 1 PowerOf1024)
gibt die Einstellung in Kilobyte an(SELECT 2 PowerOf1024)
gibt die Einstellung in Megabyte an(SELECT 3 PowerOf1024)
gibt die Einstellung in Gigabyte anEs gibt keinen Ersatz für gesunden Menschenverstand. Wenn Sie über begrenzten Arbeitsspeicher, eine Mischung aus Speicher-Engines oder eine Kombination davon verfügen, müssen Sie sich auf verschiedene Szenarien einstellen.
Mögliche Szenarien sind endlos !!!
Denken Sie daran, was auch immer Sie zuweisen, lassen Sie genügend RAM für DB Connections und das Betriebssystem.
InnoDB bietet:
In InnoDB können alle Daten hintereinander außer TEXT und BLOB maximal 8.000 Bytes belegen. Die Volltextindizierung ist in InnoDB erst ab MySQL 5.6 (Feb 2013) verfügbar. In InnoDB werden die COUNT(*)
s (wenn WHERE
, GROUP BY
oder JOIN
nicht verwendet) langsamer ausgeführt als in MyISAM, da die Zeilenzahl nicht intern gespeichert wird. InnoDB speichert sowohl Daten als auch Indizes in einer Datei. InnoDB verwendet einen Pufferpool, um sowohl Daten als auch Indizes zwischenzuspeichern.
MyISAM bietet:
COUNT(*)
s (wenn WHERE
, GROUP BY
oder JOIN
nicht verwendet wird )MyISAM hat Sperren auf Tabellenebene, aber keine Sperren auf Zeilenebene. Keine Transaktionen. Keine automatische Wiederherstellung nach einem Absturz, bietet jedoch die Funktionalität einer Reparaturtabelle. Keine Fremdschlüsseleinschränkungen. MyISAM-Tabellen haben im Vergleich zu InnoDB-Tabellen im Allgemeinen eine kompaktere Größe auf der Festplatte. Die Größe von MyISAM-Tabellen kann bei Bedarf durch Komprimieren mit myisampack weiter stark reduziert werden, ist jedoch schreibgeschützt. MyISAM speichert Indizes in einer Datei und Daten in einer anderen. MyISAM verwendet Schlüsselpuffer für die Zwischenspeicherung von Indizes und überlässt die Verwaltung der Datenzwischenspeicherung dem Betriebssystem.
Insgesamt würde ich InnoDB für die meisten Zwecke und MyISAM nur für spezielle Zwecke empfehlen. InnoDB ist jetzt die Standard-Engine in neuen MySQL-Versionen.
Eine weitere Sache: Sie können InnoDB-Tabellen sichern, indem Sie einen Schnappschuss des Dateisystems erstellen. Das Sichern von MyISAM erfordert die Verwendung von mysqldump und ist nicht garantiert konsistent (wenn Sie z. B. in eine übergeordnete und eine untergeordnete Tabelle einfügen, finden Sie möglicherweise nur die Zeile der untergeordneten Tabelle in Ihrer Sicherung).
Wenn Sie eine andere Kopie der Daten haben und diese nur in MySQL zwischenspeichern, um beispielsweise einen Standardzugriff von einer PHP-Website aus zu ermöglichen, ist MyISAM in Ordnung (dh es ist besser als eine flache CSV-Datei oder eine Protokolldatei zum Abfragen und Speichern) gleichzeitiger Zugriff). Wenn die Datenbank die eigentliche „Masterkopie“ der Daten ist, wenn Sie tun , INSERT
und UPDATE
reale Daten von Benutzern verwendet wird , dann ist es töricht , etwas anderes als InnoDB zu verwenden, um jede Art von Skala MyISAM ist unzuverlässig und schwer zu verwalten, Sie mache die myisamchk
halbe Zeit und negiere alle Leistungsgewinne ...
(Meine persönliche Erfahrung: eine 2-Terabyte-Datenbank in MyISAM).
Ein bisschen zu spät zum Spiel ... aber hier ist ein ziemlich umfassender Beitrag, den ich vor ein paar Monaten geschrieben habe und der die Hauptunterschiede zwischen MYISAM und InnoDB aufzeigt. Nimm eine Tasse (und vielleicht einen Keks) und genieße.
Der Hauptunterschied zwischen MyISAM und InnoDB besteht in der referenziellen Integrität und den Transaktionen. Es gibt auch andere Unterschiede wie Sperren, Rollbacks und Volltextsuchen.
Die referenzielle Integrität stellt sicher, dass die Beziehungen zwischen Tabellen konsistent bleiben. Genauer gesagt bedeutet dies, wenn eine Tabelle (z. B. Listings) einen Fremdschlüssel (z. B. Product ID) hat, der auf eine andere Tabelle (z. B. Products) verweist, und wenn Aktualisierungen oder Löschungen in der Tabelle, auf die verwiesen wird, erfolgen diese Änderungen in Kaskade mit der Verknüpfung Tabelle. In unserem Beispiel werden beim Umbenennen eines Produkts auch die Fremdschlüssel der Verknüpfungstabelle aktualisiert. Wenn ein Produkt aus der Tabelle "Produkte" gelöscht wird, werden auch alle Auflistungen gelöscht, die auf den gelöschten Eintrag verweisen. Darüber hinaus muss für jede neue Auflistung dieser Fremdschlüssel auf einen gültigen, vorhandenen Eintrag verweisen.
InnoDB ist ein relationales DBMS (RDBMS) und verfügt daher über referenzielle Integrität, MyISAM hingegen nicht.
Daten in einer Tabelle werden mithilfe von DML-Anweisungen (Data Manipulation Language) wie SELECT, INSERT, UPDATE und DELETE verwaltet. Bei einer Transaktion werden zwei oder mehr DML-Anweisungen zu einer einzigen Arbeitseinheit zusammengefasst, sodass entweder die gesamte Einheit angewendet wird oder keine.
MyISAM unterstützt keine Transaktionen, während InnoDB dies tut.
Wenn eine Operation während der Verwendung einer MyISAM-Tabelle unterbrochen wird, wird die Operation sofort abgebrochen, und die betroffenen Zeilen (oder sogar Daten in jeder Zeile) bleiben betroffen, auch wenn die Operation nicht vollständig ausgeführt wurde.
Wenn eine Operation während der Verwendung einer InnoDB-Tabelle unterbrochen wird, weil Transaktionen verwendet werden, die atomar sind, wird jede Transaktion, die nicht abgeschlossen wurde, nicht wirksam, da kein Commit durchgeführt wird.
Wenn eine Abfrage für eine MyISAM-Tabelle ausgeführt wird, wird die gesamte Tabelle, in der sie abgefragt wird, gesperrt. Dies bedeutet, dass nachfolgende Abfragen erst ausgeführt werden, wenn die aktuelle abgeschlossen ist. Wenn Sie eine große Tabelle lesen und / oder häufig Lese- und Schreibvorgänge ausführen, kann dies einen großen Rückstand an Abfragen bedeuten.
Wenn eine Abfrage für eine InnoDB-Tabelle ausgeführt wird, werden nur die betroffenen Zeilen gesperrt. Der Rest der Tabelle bleibt für CRUD-Operationen verfügbar. Dies bedeutet, dass Abfragen gleichzeitig in derselben Tabelle ausgeführt werden können, sofern sie nicht dieselbe Zeile verwenden.
Diese Funktion in InnoDB wird als Parallelität bezeichnet. So groß die Parallelität auch ist, es gibt einen großen Nachteil, der für einen ausgewählten Bereich von Tabellen gilt, da das Wechseln zwischen Kernel-Threads mit einem Overhead verbunden ist, und Sie sollten ein Limit für die Kernel-Threads festlegen, um zu verhindern, dass der Server zum Stillstand kommt .
Wenn Sie einen Vorgang in MyISAM ausführen, werden die Änderungen übernommen. In InnoDB können diese Änderungen rückgängig gemacht werden. Die häufigsten Befehle zur Steuerung von Transaktionen sind COMMIT, ROLLBACK und SAVEPOINT. 1. COMMIT - Sie können mehrere DML-Operationen schreiben, die Änderungen werden jedoch nur gespeichert, wenn eine COMMIT-Operation ausgeführt wird. 2. ROLLBACK - Sie können alle noch nicht festgeschriebenen Operationen verwerfen. 3. SAVEPOINT - Setzt einen Punkt in der Liste von Operationen, auf die eine ROLLBACK-Operation zurückgesetzt werden kann
MyISAM bietet keine Datenintegrität - Hardwarefehler, unsauberes Herunterfahren und abgebrochene Vorgänge können dazu führen, dass die Daten beschädigt werden. Dies würde eine vollständige Reparatur oder Neuerstellung der Indizes und Tabellen erfordern.
InnoDB verwendet dagegen ein Transaktionsprotokoll, einen Doppelschreibpuffer sowie eine automatische Prüfsumme und Validierung, um Beschädigungen zu vermeiden. Bevor InnoDB Änderungen vornimmt, zeichnet es die Daten vor den Transaktionen in einer Systemtabellenbereichsdatei mit dem Namen ibdata1 auf. Sollte es zu einem Absturz kommen, würde InnoDB diese Protokolle automatisch wiederherstellen.
InnoDB unterstützt die FULLTEXT-Indizierung erst ab MySQL Version 5.6.4. Zum Zeitpunkt des Schreibens dieses Beitrags ist die MySQL-Version vieler Shared Hosting-Anbieter immer noch unter 5.6.4, was bedeutet, dass die FULLTEXT-Indizierung 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. Nicht dass eine MyISAM-Tabelle, die die FULLTEXT-Indizierung verwendet, nicht in eine InnoDB-Tabelle konvertiert werden kann.
Zusammenfassend sollte InnoDB die Standard-Speicher-Engine Ihrer Wahl sein. Wählen Sie MyISAM oder andere Datentypen, wenn sie einem bestimmten Bedarf entsprechen.
Meiner Erfahrung nach besteht der größte Unterschied darin, wie jeder Motor mit dem Verriegeln umgeht. InnoDB verwendet die Zeilensperre, während MyISAM die Tabellensperre verwendet. Als Faustregel verwende ich InnoDB zum Schreiben schwerer Tabellen und MyISAM zum Lesen schwerer Tabellen.
Weitere wichtige Unterschiede sind:
FULLTEXT
und SPATIAL
. InnoDB ist sowohl für Lese- als auch für Schreiblast geeignet.
Ich neige dazu, MyISAM als die 'Standard'-Tabellenauswahl für MySQL anzusehen, daher werde ich auf die Unterschiede für die meisten Benutzer von InnoDB hinweisen
MYISAM
MYISAM bietet Tabellensperrung und FULLTEXT-Suche. MYISAM verfügt über die flexibelste Spalte AUTO_INCREMENTED, die alle Speicher-Engines abwickelt. MYISAM unterstützt keine Transaktionen.
INNODB
INNODB ist eine transaktionssichere Speicher-Engine. INNODB verfügt über Funktionen zum Festschreiben, Zurücksetzen und Wiederherstellen nach einem Absturz. INNODB unterstützt die referenzielle Integrität von Fremdschlüsseln.
Beinhaltet Änderungen an MySQL 5.6
INNODB-LAGERUNGSMOTOR:
Es macht also keinen Sinn, MyISAM
Engine zu verwenden, wenn Sie bereits ein Upgrade auf 5.6 durchgeführt haben. Wenn nicht, warten Sie nicht auf das Upgrade auf MySQL 5.6.
MyISAM ist eine Speicher-Engine für MySQL. Vor MySQL 5.5 war es die Standard-Speicher-Engine für MySQL. Es basiert auf der älteren ISAM Storage Engine. MyISAM ist für Umgebungen mit umfangreichen Leseoperationen und wenigen oder gar keinen Schreibvorgängen optimiert. Der Grund, warum MyISAM schnelle Lesevorgänge ermöglicht, liegt in der Struktur seiner Indizes: Jeder Eintrag verweist auf einen Datensatz in der Datendatei, und der Zeiger ist vom Dateianfang versetzt. Auf diese Weise können Datensätze schnell gelesen werden, insbesondere wenn das Format FEST ist. Somit haben die Reihen eine konstante Länge. Ein typischer Bereich, in dem man MyISAM bevorzugen könnte, ist Data Warehouse, da Abfragen in sehr großen Tabellen erforderlich sind. Die Aktualisierung solcher Tabellen erfolgt, wenn die Datenbank nicht verwendet wird (normalerweise nachts). Einfügungen sind ebenfalls einfach, da neue Zeilen an das Ende der Datendatei angehängt werden. Jedoch, Lösch- und Aktualisierungsvorgänge sind problematischer: Löschvorgänge müssen ein Leerzeichen enthalten, da sich sonst die Versätze der Zeilen ändern würden. Gleiches gilt für Aktualisierungen, da die Länge der Zeilen kürzer wird. Wenn die Zeile durch die Aktualisierung länger wird, wird die Zeile fragmentiert. Um Zeilen zu defragmentieren und leeren Speicherplatz zu beanspruchen, wird das SymbolOPTIMIZE TABLE
Befehl muss ausgeführt werden. Aufgrund dieses einfachen Mechanismus sind MyISAM-Indexstatistiken normalerweise recht genau. Andere Hauptnachteile von MyISAM sind das Fehlen von Transaktionsunterstützung und Fremdschlüsseln.
InnoDB ist eine Speicher-Engine für MySQL. MySQL 5.5 und höher verwenden es standardmäßig. Es bietet die standardmäßigen ACID-kompatiblen Transaktionsfunktionen sowie Fremdschlüsselunterstützung (Declarative Referential Integrity). Es implementiert sowohl SQL- als auch XA-Transaktionen, Tablespaces, FULLTEXT
Indizes und räumliche Operationen gemäß dem OpenGIS-Standard. Es ist standardmäßig in den meisten von MySQL AB vertriebenen Binärdateien enthalten, mit Ausnahme einiger OEM-Versionen. Die Software ist von der Oracle Corporation zweifach lizenziert. Es wird unter der GNU General Public License vertrieben, kann aber auch an Parteien lizenziert werden, die InnoDB in proprietärer Software kombinieren möchten.
MariaDB hat eine Speicher-Engine namens Aria, die als "crashsichere Alternative zu MyISAM" bezeichnet wird. MariaDB und Percona Server verwenden standardmäßig eine Abzweigung von InnoDB namens XtraDB. XtraDB wird von Percona gepflegt. Die Änderungen von Oracle InnoDB werden regelmäßig in XtraDB importiert und einige Fehlerkorrekturen und zusätzliche Funktionen hinzugefügt.