Obwohl viele der unten stehenden Antworten richtig sind, lassen sie die Dinge nicht eindeutig auf den Punkt bringen, IMHO. Diese Site macht es und das Wichtigste: InnoDB ist das Sperren auf Zeilenebene, MyISAM das Sperren auf Tabellenebene. Dies bedeutet, dass MyISAM im Allgemeinen besser für OLAP (Analyse, meistens Lesen) und InnoDB besser für OLTP (Transaktionen, meistens Schreiben oder zumindest viele Schreiben) ist.
Mike Williamson
Antworten:
159
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 FULLTEXTSuchindizes 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 ):
InnoDB verfügt über Sperren auf Zeilenebene. MyISAM kann nur Sperren auf Tabellenebene ausführen.
InnoDB bietet eine bessere Wiederherstellung nach einem Absturz.
MyISAM hat FULLTEXTSuchindizes, InnoDB erst mit MySQL 5.6 (Feb 2013).
InnoDB implementiert Transaktionen, Fremdschlüssel und Beziehungsbeschränkungen, MyISAM nicht.
Sehr geehrter Herr, also was soll man letztendlich verwenden? MyISAM oder InnoDB? bin total verwirrt ... meine website benutzt mysql und ich muss mich entscheiden.
sqlchild
3
Notieren Sie sich je nach Anwendung eine Liste mit den gewünschten Funktionen (z. B. Volltextsuche, Fremdschlüssel ...) und versuchen Sie, sich für eine zu entscheiden (versuchen Sie, jede Funktion zu bewerten und dann die Punktzahl zu zählen). Sie werden nicht in der Lage sein, alle zu haben, aber es liegt an Ihnen, zu entscheiden, welche Funktion am meisten benötigt wird.
Poelinca
2
Ich habe seinen Beitrag zur Klarstellung bearbeitet.
Mathias Lykkegaard Lorenzen
1
@ MathiasLykkegaardLorenzen danke, das ist einer der Gründe, warum wir Stackexchange mögen
Ein weiterer wichtiger Unterschied, der noch nicht erwähnt wurde, besteht darin, wie das Caching für jede Speicher-Engine durchgeführt wird.
MYISAM
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:
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.
InnoDB
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_sizeFROM(SELECT SUM(data_length+index_length) KBS FROM information_schema.tablesWHERE engine='InnoDB') A,(SELECT2 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:
Schritt 1) Fügen Sie innodb_log_file_size = NNN zu /etc/my.cnf hinzu (NNN sollte 25% von innodb_buffer_pool_size oder 2047M betragen, je nachdem, welcher Wert kleiner ist).
Schritt 2) service mysql stop
Schritt 3) rm /var/log/mysql/ib_logfile[01]
Schritt 4) service mysql start(ib_logfile0 und ib_logfile1 werden neu erstellt)
VORBEHALT
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 an
Es werden keine Potenzen kleiner als 0 oder größer als 3 akzeptiert
EPILOG
Es 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.
Wenn Sie über 2 GB RAM und 16 GB InnoDB verfügen, weisen Sie 512 MB als innodb_buffer_pool zu.
Wenn Sie über 2 GB RAM und 4 GB MyISAM-Indizes verfügen, weisen Sie 512 MB als key_buffer_size zu.
Wenn Sie über 2 GB RAM, 4 GB MyISAM-Indizes und 16 GB InnoDB verfügen, weisen Sie 512 MB als key_buffer_size und 512 MB als innodb_buffer_pool_size zu.
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.
(Hoppla - vergiss nicht, dass es keine Absätze geben kann) ... Ich werde eine "Antwort" hinzufügen.
Rick James
Rolando-Formeln für Cache-Größen sind nicht praktisch. - Potenzen von 2 werden nicht benötigt. - 4 GB auf einem 32-Bit-Betriebssystem sind unmöglich - usw. Hier ist mein Überblick darüber, wie ich sie einstellen soll: mysql.rjweb.org/doc.php/memory (Es werden verschiedene andere Einstellungen behandelt, die sich auf die Speichernutzung auswirken.)
Rick James
2
@Rick: Die Potenzen von 2 sollten die Antworten in verschiedenen Einheiten anzeigen. Tun (SELECT 2 PowerOfTwo) Legt die Anzeige der Antwort in MB fest. Tun (SELECT 3 PowerOfTwo) Stellt die Anzeige in GB ein. (SELECT 1 PowerOfTwo) Wird in KB angezeigt. (SELECT 0 PowerOfTwo) Wird in Bytes angezeigt. Das macht der (SELECT 2 PowerOfTwo). Es ist daher NUR ANZEIGEN erforderlich, um der Architektur keine angenommenen Werte aufzuerlegen.
RolandoMySQLDBA
2
@ Rick: Weißt du was? Ich werde Ihnen aus zwei sehr wichtigen Gründen eine +1 geben. 1) Ihre URL bestätigt, dass meine Antwort richtig war, da 4 GB die größte Zahl ist, die der key_buffer_size zugewiesen werden muss. 2) Ihre Antwort mit Ihrer URL ist für Computer mit sehr geringem Arbeitsspeicher sinnvoll. Ich werde Kredit geben, wo Kredit fällig ist.
RolandoMySQLDBA
60
InnoDB bietet:
ACID-Transaktionen
Verriegelung auf Zeilenebene
Fremdschlüsseleinschränkungen
automatische Wiederherstellung nach einem Absturz
Tabellenkomprimierung (Lesen / Schreiben)
Geodatentypen (keine räumlichen Indizes)
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 BYoder JOINnicht 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:
schnell COUNT(*)s (wenn WHERE, GROUP BYoder JOINnicht verwendet wird )
Volltextindizierung (Update: unterstützt in InnoDB ab MySQL 5.6)
Geringerer Platzbedarf
sehr hohe Tabellenkomprimierung (schreibgeschützt)
Geodatentypen und Indizes (R-Tree) (Update: unterstützt in InnoDB von MySQL 5.7)
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.
Ich habe deine Antwort gelesen und bereits hier mit den anderen verglichen. Nur Sie erwähnen BLOBs. Sie werden in der Regel als selbstverständlich angesehen. Ihr Name ist auch der einzige, der myisampack erwähnt, einen der unbesungenen Helden der schnell lesbaren MyISAM-Tabellen. Dein ist heute eine +1 !!!
RolandoMySQLDBA
2
Ein Beispiel wäre eine komprimierte Nur-Lese-Tabelle, bei der nur selten Aktualisierungen vorgenommen werden, indem die Tabelle vollständig ersetzt wird.
dabest1
30
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 , INSERTund UPDATEreale 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 myisamchkhalbe 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.
Referentielle Integrität
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.
Transaktionen und Atomarität
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.
Tabellensperrung vs. Zeilensperrung
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 .
Transaktionen und Rollbacks
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
Verlässlichkeit
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.
Volltextindizierung
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.
Fazit
Zusammenfassend sollte InnoDB die Standard-Speicher-Engine Ihrer Wahl sein. Wählen Sie MyISAM oder andere Datentypen, wenn sie einem bestimmten Bedarf entsprechen.
Danke, sehr informative und übersichtliche Zusammenfassung.
informatik01
18
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:
InnoDB unterstützt Transaktionen und Fremdschlüssel. MyISAM nicht.
MyISAM verwendet die Volltextindizierung.
MyISAM leistet schlechte Arbeit bei der Durchsetzung der Datenintegrität.
Veraltet - InnoDB hat FULLTEXTund SPATIAL. InnoDB ist sowohl für Lese- als auch für Schreiblast geeignet.
Rick James
8
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
Reihenebenensperre
Durchsetzung von Fremdschlüsseln
Transaktionsunterstützung
Leistungseinbußen bei stark ausgelasteten Systemen
mit Ausnahme der neuesten MySQL-Version wird MyISAM nicht mehr als Standard-Engine verwendet. In 5.5 haben sie den Standard auf InnoDB geändert :). Und ich würde der Verallgemeinerung nicht zustimmen, dass InnoDB im Allgemeinen nur einen "Performance-Hit" bekommt. Gut gestaltete InnoDB-Tabellen mit korrekter Indizierung und gut konfigurierten Speichereinstellungen können dazu führen, dass eine InnoDB-Tabelle um
Uhr
3
In vielen Situationen, in denen InnoDB häufig verwendet wird, ist die Leistung von InnoDB weitaus besser als die von MyISAM. MyISAM ist ein spezielles Tool für ein bestimmtes Problem, während InnoDB in den meisten Situationen bessere Dienste leistet (daher hat das MySQL-Team es zur Standard-Engine gemacht). Dies ist darauf zurückzuführen, dass MyISAM lange Zeit die einzige Engine war, die die MySQL-Community angewöhnt hat, MyISAM standardmäßig zu verwenden, selbst nachdem InnoDB ausgereift war.
Nick Chammas
2
Die FULLTEXT-Suche nach InnoDB wurde während des Entwicklungszyklus von MySQL 5.6 hinzugefügt. Die angegebene URL deckt nun auch InnoDB ab.
Max Webster
5
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.
Es bietet volle ACID-Konformität (Atomizität, Konsistenz, Isolation, Haltbarkeit). Durch die Multi-Versionierung werden Transaktionen voneinander isoliert.
InnoDB bietet eine automatische Wiederherstellung nach einem Absturz des MySQL-Servers oder des Hosts, auf dem der Server ausgeführt wird.
InnoDB unterstützt Fremdschlüssel und referenzielle Integrität, einschließlich kaskadierter Lösch- und Aktualisierungsvorgänge.
MySQL 5.6 baut auf der Plattform von InnoDB auf, die als Standardspeicher-Engine vollständig integriert ist
Persistent Optimizer Stats : Verbesserte Genauigkeit der InnoDB-Indexstatistik und Konsistenz bei MySQL-Neustarts.
Bereinigen des InnoDB-Tabellencaches: Um die Speicherauslastung auf Systemen mit einer großen Anzahl von Tabellen zu verringern, gibt InnoDB jetzt den Speicher frei, der einer geöffneten Tabelle zugeordnet ist. Ein LRU-Algorithmus wählt Tabellen aus, auf die am längsten nicht zugegriffen wurde.
Unterstützt die Volltextsuche: Eine spezielle Art von Index, der FULLTEXT-Index, hilft InnoDB bei der Bearbeitung von Abfragen und DML-Operationen mit textbasierten Spalten und den darin enthaltenen Wörtern. Diese Indizes werden physisch als gesamte InnoDB-Tabellen dargestellt.
InnoDB scheint in der Volltextsuche viel schneller zu sein als MyISAM
Es macht also keinen Sinn, MyISAMEngine 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 TABLEBefehl 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
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, FULLTEXTIndizes 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.
Gabeln
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.
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).quelle
version 5.6.4
InnoDB unterstütztFULLTEXT
Suche. dev.mysql.com/doc/refman/5.6/en/fulltext-restrictions.htmlEin weiterer wichtiger Unterschied, der noch nicht erwähnt wurde, besteht darin, wie das Caching für jede Speicher-Engine durchgeführt wird.
MYISAM
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:
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.
InnoDB
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:
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)VORBEHALT
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 anEPILOG
Es 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.
quelle
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 (wennWHERE
,GROUP BY
oderJOIN
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 (wennWHERE
,GROUP BY
oderJOIN
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.
quelle
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
undUPDATE
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 diemyisamchk
halbe Zeit und negiere alle Leistungsgewinne ...(Meine persönliche Erfahrung: eine 2-Terabyte-Datenbank in MyISAM).
quelle
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.
Referentielle Integrität
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.
Transaktionen und Atomarität
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.
Tabellensperrung vs. Zeilensperrung
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 .
Transaktionen und Rollbacks
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
Verlässlichkeit
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.
Volltextindizierung
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.
Fazit
Zusammenfassend sollte InnoDB die Standard-Speicher-Engine Ihrer Wahl sein. Wählen Sie MyISAM oder andere Datentypen, wenn sie einem bestimmten Bedarf entsprechen.
quelle
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:
quelle
FULLTEXT
undSPATIAL
. 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
quelle
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.
quelle
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.InnoDB VS MyISAM-Leistung mit MySQL 5.6
quelle
MyISAM
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 Symbol
OPTIMIZE 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
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.Gabeln
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.
quelle