Was ist der Unterschied zwischen InnoDB und MyISAM?


17

Ich verwende MySQL als meine Datenbank für mein aktuelles Webprojekt. Ich bin neu in MySQL. Bitte erläutern Sie mir den Unterschied zwischen InnoDB und MyISAM.


Sie können auch ein MySQL-Tag hinzufügen :)
Johan

Gehört das nicht zum Stackoverflow?
Ripper234

@ ripper234. Zu SO existieren zwei bessere Versionen dieses Beitrags (viel mehr Hintergrund; mehr Demonstration früherer Untersuchungen): stackoverflow.com/q/12614541/209139 und stackoverflow.com/q/20148/209139 .
TRiG

Antworten:


14

ISAM = Indizierte sequentielle Zugriffsmethode und ist im Wesentlichen eine flache Datei (für diejenigen DBAs, die sich an Btrieve oder B-Tree erinnern können). Es ist eine sehr alte Technologie - aber lass dich nicht davon abhalten, sie zu verwenden. Da es sich um eine Flat-Datei handelt (dazu später mehr), handelt es sich nicht um eine relationale Datei und ist daher kein RDBMS. In einigen Situationen ist dies auch angemessener.

InnoDB ist das vollständige RDBMS, mit dem Sie wahrscheinlich vertraut sind. MyISAM kann durch eine weitere hinzugefügte Schicht relational erscheinen, die Ihre Verknüpfungen, Logik und referenzielle Integrität beibehält.

ISAM ist hervorragend, wenn Sie viele Datensätze haben (z. B. 20 Millionen) und die Datensätze meistens eigenständig sind (dh Sie müssen nicht viele Links erstellen, um die zugehörigen Daten abzurufen). Es ist SEHR stark auf Indizes angewiesen. Wenn Sie nicht über den richtigen Index verfügen, sollten Sie auf sehr lange Abfragezeiten vorbereitet sein. Ein typisches Beispiel: Wir hatten eine Btrieve-ISAM-Tabelle mit über 20 Millionen Datensätzen, und das Abrufen und Filtern von Daten basierend auf einem genauen Index war fast augenblicklich. Die Verwendung des falschen Index betrug buchstäblich 15 Minuten.

InnoDB ist ideal, wenn Sie viele relationale Links haben. Tabelle A verweist auf ein Feld in Tabelle B, in dem auf Tabelle C und D verwiesen wird. InnoDB kann diese Datensätze mit allen Arten von nützlichen Verknüpfungsmethoden (Hash-Verknüpfungen usw.) abrufen, wohingegen eine ISAM-Datenbank für jede einzelne mehrere Unterabfragen ausführen müsste Manuelles Anordnen und Abgleichen der Datensätze.

Sie müssen wirklich einen Kurs in Datenbanken machen, wenn Sie viel mehr Details wollen!


ISAM ist genauso relational wie alles andere, es ist einfach nicht dafür optimiert.
LapTop006,

danke 4 deine kurze beschreibung. Jetzt bin ich im Grunde gelöscht

5

Am grundlegendsten ist, dass InnoDB transaktionell ist. MyIsam ist nicht. MyIsam ist in der Regel etwas schneller. Wenn Sie also keine Transaktionen benötigen, ist dies in der Regel die beste Wahl. Detaillierte Beschreibungen finden Sie in der MySQL-Dokumentation.


2

Heutzutage ist InnoDB in der Regel schneller, zuverlässiger, verfügt über mehr Funktionen usw., es sei denn, Sie verwenden eine Tabelle für Protokollstildaten (viel mehr INSERTs als SELECTs, keine Transaktionen).

Die einzige andere Funktion, die MyISAM bietet, ist die Volltextsuche, die für den grundlegenden Gebrauch in Ordnung ist, aber die meisten Leute verwenden einige von Lucene für irgendetwas Ernstes.

In beiden Fällen müssen Sie MySQL optimieren, da die Standardeinstellungen im Wesentlichen für ein 32-MB-Pentium festgelegt sind, das mit anderen Diensten gemeinsam genutzt wird.


2

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 an der Tabelle, auf die verwiesen wird, vorgenommen werden, werden diese Änderungen in die Verknüpfung übernommen Tabelle. In unserem Beispiel werden beim Umbenennen eines Produkts auch die Fremdschlüssel der Verknüpfungstabelle aktualisiert. Wird ein Produkt aus der Tabelle "Produkte" gelöscht, werden auch alle Einträge 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 ausgefü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.


1

Im Allgemeinen gilt die Faustregel: Wenn Sie Geschwindigkeit wünschen, verwenden Sie MyISAM, und wenn Sie Stabilität wünschen, verwenden Sie InnoDB. Etwas mit Atomizität zu tun, wenn ich mich richtig erinnere.


3
Abgesehen davon, dass dies nicht mehr der Fall ist, ist InnoDB in den meisten Fällen tatsächlich schneller.
LapTop006

1
kann jemand einen link ein paar benchmarks hinzufügen oder so ...?
Johan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.