Was MySQL betrifft, ist es schwierig, MyISAM und InnoDB zu verstehen, die zwei der bekanntesten und am weitesten verbreiteten MySQL-Speicher-Engines sind. Heute werde ich mit Ihnen über den Unterschied zwischen MyISAM und InnoDB in MySQL sprechen...
Was ist MyISAM?
MyISAM ist die Standardspeicher-Engine für das MySQL-Relationaldatenbankverwaltungssystem (vor Version 5.5)。 Diese MySQL-Tabellenspeicherstruktur erweitert viele nützliche Funktionen aus dem alten ISAM-Code. In der neuen Version von MySQL ersetzt die InnoDB-Engine MyISAM weitgehend aufgrund ihrer Vorteile in Bezug auf Transaktionen, referenzielle Integrität und höhere Nebenzeitigkeit. Jede MyISAM-Tabelle entspricht drei Dateien auf der Festplatte. Alle drei Dateien haben denselben Dateinamen, haben jedoch unterschiedliche Erweiterungen, um ihren Typzweck anzuzeigen: Die .frm-Datei enthält die Definition der Tabelle, aber diese Datei ist nicht Teil der MyISAM-Engine, sondern Teil des Servers; .MYD enthält die Daten der Tabelle; .MYI ist die Indexdatei der Tabelle.
Was ist InnoDB?
InnoDB ist eine weitere Speicher-Engine für MySQL, und die neue Version des von MySQL AB veröffentlichten Standards ist in allen binären Installationspaketen enthalten.Ab 5.5 als Standardspeicher-Engine。 Seine Vorteile gegenüber anderen Speicher-Engines sind die Unterstützung von ACID-kompatiblen Transaktionen (ähnlich PostgreSQL) und die Parameterintegrität (d. h. Unterstützung von Fremdschlüsseln).
Die Oracle Corporation übernahm Innobase im Oktober 2005. Innobase verwendet eine doppelte Authentifizierungsautorisierung. Es wird über GNU verteilt und ermöglicht es auch anderen Gruppen, die InnoDB in kommerzielle Software integrieren möchten, eine Lizenz zu erhalten.
Die beliebtesten Speicher-Engines sind MyISAM und InnoDB. Die Hauptunterschiede zwischen MyISAM und InnoDB sind Leistung und Transaktionskontrolle. MyISAM ist eine erweiterte Implementierung der frühen ISAM (Indexed Sequential Access Method, ISAM wird nach MySQL 5.0 nicht mehr unterstützt), ISAM ist darauf ausgelegt, Situationen zu bewältigen, in denen die Lesefrequenz viel höher ist als die Schreibfrequenz, sodass ISAM und spätere MyISAM die Unterstützung von Dingen nicht berücksichtigen, TPM ausschließen, keine Transaktionsaufzeichnungen benötigen, die Effizienz der ISAM-Abfragen beträchtlich ist und der Speicherverbrauch sehr gering ist. MyISAM erbt diese Vorteile, während es mit einer Vielzahl nützlicher neuer Funktionen und zugehöriger Tools Schritt hält. Zum Beispiel werden unter Berücksichtigung der Nebenlaufregelung tabellennahe Sperren bereitgestellt, und obwohl MyISAM selbst keine Fehlertoleranz unterstützt, kann es verwendet werden, um Fehler durch Myisamchk zu beheben. Und da MyISAM für jede Tabelle eigene unabhängige Speicherdateien (MYD-Datendatei und Myi-Indexdatei) verwendet, ist es sehr bequem, Backups und Wiederherstellungen herzustellen (Kopierüberschreibung reicht aus) und unterstützt auch Online-Wiederherstellung. Im Vergleich zu anderen Speicher-Engines verfügt MyISAM über die meisten Werkzeuge zur Überprüfung und Reparatur von Tabellen. MyISAM-Tabellen können komprimiert werden und unterstützen die Volltextsuche. Sie sind nicht transaktionssicher und unterstützen keine Fremdschlüssel, also wenn Ihre Anwendung keine Transaktionen benötigt und nur grundlegende CRUD-Operationen abwickelt, ist MyISAM der richtige Weg. InnoDB ist für Lese- und Schreibsituationen mit hoher Nebenwirkung konzipiert und verwendet MVCC (Multi-Version Concurrency Control) und Zeilensperrungen, um ACID-konforme Transaktionsunterstützung zu bieten. InnoDB unterstützt die Integrität von Fremdschlüsselreferenzen und verfügt über Fehlerwiederherstellungsfunktionen. Außerdem ist die Leistung von InnoDB tatsächlich recht gut, insbesondere bei der Verarbeitung großer Datenmengen, offiziell: Die CPU-Effizienz von InnoDB ist mit anderen festplattenbasierten relationalen Datenbankspeicher-Engines nicht vergleichbar. Allerdings ist das Backup und die Wiederherstellung von InnoDB etwas umständlicher, es sei denn, man nutzt die Multi-Tablespace-Unterstützung von Version 4.1 oder neuer, da im Gegensatz zu MyISAM die Datendateien von InnoDB nicht unabhängig mit jeder Tabelle korrespondieren. Stattdessen wird der geteilte Tabellenraum verwendet, und die einfache Copy-Overwriting-Methode ist für ihn nicht geeignet, sodass die Daten nach dem Stopp von MYSQL wiederhergestellt werden müssen. Durch die Verwendung von per-table tablespacesd entspricht jede Tabelle einer separaten Tablespace-Datei, die Situation ist viel einfacher. Es hat die gleichen Eigenschaften wie BDB-Typen und unterstützt auch Fremdschlüssel. InnoDB-Tabellen sind schnell und verfügen über umfangreichere Funktionen als BDB, daher wird empfohlen, wenn Sie eine transaktionssichere Speicher-Engine benötigen.
Im Allgemeinen ist InnoDB eine gute Wahl, wenn Transaktionsunterstützung benötigt wird und eine hohe gleichzeitige Lese- und Schreibfrequenz aufweist. BDB kann betrachtet werden, wenn die Häufigkeit gleichzeitiger Lese- und Schreibvorgänge nicht hoch ist, aber BDB wird in MySQL 5.1 und späteren Versionen nicht mehr unterstützt. Diese Option ist weg.
Standardmäßig sind InnoDB-Transaktionen offen (autocommit = 0 setzen), was bedeutet, dass jedes Mal, wenn ein Datensatz eingefügt wird, die InnoDB-Tabelle ihn als separate Transaktion behandelt. Wenn wir also 10.000 Datensätze einfügen und die Transaktion nicht schließen, behandelt die InnoDB-Typtabelle sie als 10.000 Transaktionen, und die Gesamtzeit der Einfügung zu diesem Zeitpunkt ist groß. Zu diesem Zeitpunkt müssen wir die Transaktion zuerst abschalten und dann einfügen, sodass die Geschwindigkeit sehr hoch sein wird. Was Heap und BDB (Berkeley DB) betrifft, ist die Durchdringungsrate relativ gesehen nicht so gut wie bei den beiden vorherigen Transaktionen, aber in einigen Fällen, Die Heap-Speicher-Engine ist immer noch sehr anwendbar, speichert Daten im Speicher und ist extrem schnell, da es keine Festplatten-I/O-Wartezeit gibt. Da es sich jedoch um eine Speicherspeicher-Engine handelt, verschwinden alle vorgenommenen Änderungen nach dem Neustart des Servers. Heap ist ein großartiger Ort, um BDB zum Testen zu nutzen, da es MySQLS erste transaktionssichere Speicher-Engine ist. Basierend auf der Berkeley DB-Datenbankbibliothek ist es ebenfalls transaktionssicher, aber BDB ist offensichtlich nicht so beliebt wie InnoDB, da die meisten Speicher-Engines in MySQL, die Transaktionen unterstützen, ebenfalls nach MVCC- oder Zeilen-Level-Locking-Speicher-Engines suchen, während BDB nur Page-Level Lock unterstützt.
InnoDB-Engine
InnoDB ist eine transaktionale Speicher-Engine, die Rollbacks unterstützt und darauf ausgelegt ist, Hochleistungsdienste bei der Verarbeitung großer Datenmengen bereitzustellen; es richtet Pufferpools im Speicher zur Laufzeit ein, um Daten und Indizes zu puffern.
Vorteile der InnoDB-Engine:
1. Unterstützung der Transaktionsverarbeitung und ACID-Transaktionsfunktionen;
2. Vier Isolationsebenen des SQL-Standards werden realisiert;
3. Unterstützung von Zeilen-Sperr- und Fremdschlüsselbeschränkungen;
4. Sie können Transaktionsprotokolle zur Datenwiederherstellung verwenden.
5. Das Lock-Level ist Reihen-Lock, das sich für häufige Tabellenmodifikationen mit hoher Nebenwahl eignet, und hohe Nebenläufigkeit ist besser als MyISAM. Der Nachteil ist, dass der Systemverbrauch groß ist.
6. Der Index cacht nicht nur sich selbst, sondern speichert auch Daten, was mehr Speicher benötigt als MyISAM.
Nachteile der InnoDB-Engine:
Da die Anzahl der Zeilen in der Tabelle nicht gespeichert wird, wird die gesamte Tabelle bei Verwendung von COUNT-Statistiken durchgescannt.
MyISAM-Engine
MyISAM ist die Standard-Engine vor MySQL 5.5.5 und ist darauf ausgelegt, schnell zu lesen.
Vorteile der MyISAM-Engine:
1. Hochleistungslektüre;
2. Da die Anzahl der Zeilen in der Tabelle gespeichert wird, wird die gesamte Tabelle bei Verwendung von COUNT-Statistiken nicht gescannt;
Nachteile der MyISAM-Engine:
1. Das Schlossniveau ist ein Tischschloss, und der Vorteil des Uhrenschlosses ist, dass die Decke klein und das Schloss schnell ist; Die Nachteile sind, dass die Sperrgranularität groß ist, die Wahrscheinlichkeit eines Lock-Impulses hoch und die Nebenläufigkeitskapazität gering ist, was für fragebasierte Dienste geeignet ist.
2. Diese Engine unterstützt keine Transaktionen oder Fremdschlüssel.
3. INSERT- und UPDATE-Operationen müssen die gesamte Tabelle sperren;
4. Sie speichert die Anzahl der Zeilen in der Tabelle, sodass sie beim AUSWÄHLEN ANZAHL(*) aus der Tabelle nur die gespeicherten Werte direkt lesen muss, ohne die gesamte Tabelle zu scannen.
Anwendbare Szenarien
MyISAM eignet sich für: (1) viele Zählberechnungen; (2) Seltene Einfügungen und sehr häufige Abfragen; (3) Es gibt kein Geschäft.
InnoDB eignet sich für: (1) hohe Zuverlässigkeitsanforderungen oder -transaktionen; (2) Tabellenupdates und Abfragen sind recht häufig, und die Wahrscheinlichkeit einer Tabellensperrung ist relativ hoch.
Tabellenvergleich
| Eigenschaften | MyISAM | Haufen | BDB | InnoDB | | Transaktionen | Nicht unterstützt | Nicht unterstützt | Jemanden unterstützen | Jemanden unterstützen | | Sperrgranularität | Tabellensicherung | Tabellensicherung | Page Lock (Seite, 8KB) | Lock | | Lagerung | Dateien aufgeteilt | Im Gedenken | Eine Datei pro Tabelle | Tabellenraum | | Isolationsniveau | nicht | nicht | Lies Committed | Alle | | Portables Format | sein | N/A | nicht | sein | | Zitationsvollständigkeit | nicht | nicht | nicht | sein | | Daten-Primärschlüssel | nicht | nicht | sein | sein | | MySQL ccacht Datensätze | nicht | Ja | Ja | Ja | | Brauchbarkeit | Vollständige Version | Vollständige Version | MySQL-Max | Vollständige Version |
Einige Unterschiede in den Details
1. InnoDB unterstützt keine Indizes vom FULLTEXT-Typ, was seit MySQL 5.6 (experimentell) unterstützt wird.
2. InnoDB speichert nicht die genaue Anzahl der Zeilen der Tabelle, das heißt, beim Ausführen von select count() aus der Tabelle muss InnoDB die gesamte Tabelle scannen, um zu berechnen, wie viele Zeilen es gibt, aber MyISAM muss lediglich die Anzahl der gespeicherten Zeilen auslesen. Beachten Sie, dass wenn die count()-Anweisung eine where-Bedingung enthält, die Operation für beide Tabellen gleich ist.
3. Für Felder AUTO_INCREMENT Typs muss InnoDB einen Index nur mit diesem Feld enthalten, aber in der MyISAM-Tabelle kann man einen gemeinsamen Index mit anderen Feldern erstellen.
4. Wenn die Tabelle DELETE FROM ist, erstellt InnoDB die Tabelle nicht neu, sondern löscht sie Zeile für Zeile.
5. Die Operation LOAD TABLE FROM MASTER funktioniert für InnoDB nicht, die Lösung besteht darin, zunächst die InnoDB-Tabelle in die MyISAM-Tabelle zu ändern, die Daten zu importieren und sie dann in die InnoDB-Tabelle zu ändern, aber sie ist nicht auf die Tabelle anwendbar, die zusätzliche InnoDB-Funktionen (wie Fremdschlüssel) verwendet.
6. Außerdem ist die Zeilensperre der InnoDB-Tabelle nicht absolut; wenn MySQL den zu scannenden Bereich beim Ausführen einer SQL-Anweisung nicht bestimmen kann, sperrt die InnoDB-Tabelle auch die gesamte Tabelle.
7. InnoDB unterstützt keine Volltext-Indexierung, während MyISAM dies tut. Volltextindexierung bezeichnet die Erstellung eines Reverse-Order-Index jedes Wortes in Char, Varchar und Text (außer bei Stoppwörtern). Der Volltextindex von MyISAM ist tatsächlich nutzlos, da er keine chinesische Wortsegmentierung unterstützt und nach der Wortsegmentierung vom Benutzer in die Datentabelle geschrieben werden muss, während Wörter mit weniger als 4 chinesischen Zeichen wie Stoppwörter ignoriert werden.
|