892 Stimmen

MyISAM gegenüber InnoDB

Ich arbeite an einem Projekt, bei dem viel in Datenbanken geschrieben wird, würde ich sagen ( 70% Beilagen und 30% Lesestoff ). Dieses Verhältnis würde auch Aktualisierungen einschließen, die ich als ein Lesen und ein Schreiben betrachte. Die Lesevorgänge können unsauber sein (z. B. benötige ich keine 100%ig genauen Informationen zum Zeitpunkt des Lesens).
Die betreffende Aufgabe wird über 1 Million Datenbanktransaktionen pro Stunde umfassen.

Ich habe eine Reihe von Sachen auf dem Web über die Unterschiede zwischen MyISAM und InnoDB gelesen, und MyISAM scheint wie die offensichtliche Wahl zu mir für die bestimmte Datenbank/Tabellen, die ich für diese Aufgabe verwenden werden. Nach dem, was ich zu lesen scheine, ist InnoDB gut, wenn Transaktionen benötigt werden, da Sperren auf Zeilenebene unterstützt wird.

Hat jemand Erfahrung mit dieser Art von Belastung (oder höher)? Ist MyISAM der richtige Weg?

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.

2voto

pilavdzice Punkte 948

Ich weiß, dass dies nicht populär sein wird, aber ich sage es trotzdem:

myISAM bietet keine Unterstützung für grundlegende Datenbankfunktionen wie Transaktionen und referentielle Integrität, was häufig zu fehlerhaften Anwendungen führt. Sie können nicht lernen, wie man eine Datenbank richtig entwirft, wenn sie nicht einmal von Ihrer Datenbank-Engine unterstützt wird.

Der Verzicht auf referentielle Integrität oder Transaktionen in der Datenbankwelt ist wie der Verzicht auf objektorientierte Programmierung in der Softwarewelt.

InnoDB existiert jetzt, verwenden Sie es stattdessen! Sogar die MySQL-Entwickler haben endlich eingeräumt, dass dies die Standard-Engine in neueren Versionen ist, obwohl myISAM die ursprüngliche Engine war, die in allen Altsystemen als Standard verwendet wurde.

Nein, es spielt keine Rolle, ob Sie lesen oder schreiben oder welche Leistungserwägungen Sie haben, die Verwendung von myISAM kann zu einer Vielzahl von Problemen führen, wie dieses, auf das ich gerade gestoßen bin: Ich führte eine Datenbanksynchronisation durch und gleichzeitig griff jemand anderes auf eine Anwendung zu, die auf eine Tabelle in myISAM zugriff. Aufgrund der fehlenden Transaktionsunterstützung und der allgemein schlechten Zuverlässigkeit dieser Engine stürzte die gesamte Datenbank ab und ich musste mysql manuell neu starten!

In den letzten 15 Jahren der Entwicklung habe ich viele Datenbanken und Engines verwendet. myISAM ist mir in dieser Zeit etwa ein Dutzend Mal abgestürzt, andere Datenbanken nur einmal! Und das war eine Microsoft-SQL-Datenbank, in der ein Entwickler fehlerhaften CLR-Code (Common Language Runtime - im Grunde C#-Code, der innerhalb der Datenbank ausgeführt wird) geschrieben hat.

Ich stimme den anderen Antworten hier zu, die besagen, dass Qualitativ hochwertige Hochverfügbarkeits- und Hochleistungsanwendungen sollten myISAM nicht verwenden, da es nicht funktioniert, nicht robust und nicht stabil genug ist, um zu einer frustrationsfreien Erfahrung zu führen. Weitere Einzelheiten finden Sie in der Antwort von Bill Karwin.

P.S. Man muss es einfach lieben, wenn myISAM-Fanboys abwerten, aber Ihnen nicht sagen können, welcher Teil der Antwort falsch ist.

1voto

neal aise Punkte 855

Bei diesem Verhältnis von Lese- und Schreibvorgängen würde ich vermuten, dass InnoDB besser funktioniert. Da Sie mit schmutzigen Lesezugriffen gut zurechtkommen, könnten Sie (wenn Sie es sich leisten können) auf einen Slave replizieren und alle Lesezugriffe auf den Slave übertragen lassen. Überlegen Sie auch, ob Sie nicht lieber einen Datensatz nach dem anderen einfügen sollten.

1voto

Cyberwip Punkte 29

Fast jedes Mal, wenn ich ein neues Projekt beginne, google ich dieselbe Frage, um zu sehen, ob ich irgendwelche neuen Antworten finde.

Letztendlich läuft es darauf hinaus, dass ich die neueste Version von MySQL nehme und Tests durchführe.

Ich habe Tabellen, in denen ich Schlüssel/Wert-Lookups durchführen möchte... und das ist alles. Ich muss den Wert (0-512 Bytes) für einen Hash-Schlüssel abrufen. Es gibt nicht viele Transaktionen in dieser DB. Die Tabelle wird gelegentlich aktualisiert (in ihrer Gesamtheit), aber 0 Transaktionen.

Wir sprechen hier also nicht über ein komplexes System, sondern über eine einfache Suche und darüber, wie wir die Leistung optimieren können (abgesehen davon, dass wir die Tabelle RAM-resident machen).

Ich führe auch Tests mit anderen Datenbanken (z. B. NoSQL) durch, um zu sehen, ob ich irgendwo einen Vorteil erzielen kann. Der größte Vorteil, den ich gefunden habe, liegt in der Schlüsselzuordnung, aber was die Suche angeht, übertrifft MyISAM derzeit alle anderen.

Ich würde zwar keine Finanztransaktionen mit MyISAM-Tabellen durchführen, aber für einfache Lookups sollten Sie es ausprobieren.

Testen Sie es, ich begrüße die Debatte.

1voto

kta Punkte 18216

Wenn es 70% Inserts und 30% Reads sind, dann ist es eher auf der InnoDB Seite.

0voto

tony gil Punkte 9305

Fazit: Wenn Sie offline mit Selects auf großen Datenbeständen arbeiten, bietet MyISAM wahrscheinlich bessere (viel bessere) Geschwindigkeiten.

Es gibt einige Situationen, in denen MyISAM unendlich effizienter ist als InnoDB: bei der Offline-Bearbeitung großer Daten-Dumps (wegen der Tabellensperre).

Beispiel: Ich habe eine CSV-Datei (15 Millionen Datensätze) von NOAA konvertiert, die VARCHAR-Felder als Schlüssel verwendet. InnoDB brauchte ewig, selbst wenn große Mengen an Speicher verfügbar waren.

Dies ist ein Beispiel für eine csv-Datei (das erste und das dritte Feld sind Schlüssel).

USC00178998,20130101,TMAX,-22,,,7,0700
USC00178998,20130101,TMIN,-117,,,7,0700
USC00178998,20130101,TOBS,-28,,,7,0700
USC00178998,20130101,PRCP,0,T,,7,0700
USC00178998,20130101,SNOW,0,T,,7,

Da ich eine Batch-Offline-Aktualisierung der beobachteten Wetterphänomene durchführen muss, verwende ich die MyISAM-Tabelle für den Datenempfang und führe JOINS auf den Schlüsseln aus, damit ich die eingehende Datei bereinigen und VARCHAR-Felder durch INT-Schlüssel ersetzen kann (die mit externen Tabellen verbunden sind, in denen die ursprünglichen VARCHAR-Werte gespeichert sind).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X