PHP Blogger

Startseite Schreib mir ne Mail! RSS Abo Webnews

MyISAM oder InnoDB?

Was ist besser? MyISAM oder InnoDB? Früher war die vorgegebene Standard-Storage-Engine von MySql MyISAM. Mittlerweile ist es InnoDB. Aus aktuellem Anlass musste ich mir Gedanken machen, welche Storage-Engine die bessere Wahl ist.

Bislang war InnoDB konfiguriert, aber der Server geht wegen der aufwendigen Speicherung von InnoDB tierisch in die Knie. Zeit, sich mal auf die Vorzüge und Nachteile der jeweiligen Engine zu konzentieren:

Was InnoDB bietet:

  • Transaktionen
  • Locking auf Zeilen Ebene
  • Speicherung in Tablespaces
  • Referenzielle Integrität
  • Primärschlüssel
  • Datensatz-Cache

Jetzt kommt MyISAM:

  • Locking auf Tabellenebene
  • Speicherung in getrennten Dateien (eine pro Tabelle)
  • Volltextindizierung
  • Daten-Komprimierung

Insgesamt kann man feststellen, das MyISAM einen guten Kompromiss zwischen Performance und nützlichen Features darstellt. Weil: Features fressen bekanntlich Performance und Speicherplatz. Transaktionen, fein granuliertes Locking und referenzielle Integrität zu überwachen und zu verwalten ist bei größeren Datenbanken sehr leistungshungrig. Da kann es passieren, das man im typischen Lampbetrieb mit 4 GB RAM und einer Quad-Core CPU an die Grenzen des machbaren stößt.

Beispiel: Eine InnoDB Namespace mit 1,5 GB Größe verbraucht ca. 200% CPU Leistung (ist machbar, bei 4 CPUs = 400% ;-). Mit Apache und Kernel sind das ca. 70% Dauerlast auf dem CPU und einer RAM Nutzung von 75% - kein Wunder, das die Maschine bei kurzzeitigen Spitzenlasten schnell ins Schwitzen kommt.

Jetzt die Frage? Benötigt die Applikation den InnoDB Overhead?

  • Unterstützt die Applikation Transaktionen? Nein.
  • Können Primärschlüssel durch Unique-Indizes ersetzt werden? Generell ja, das mach bei MyISAM keinen Unterschied.
  • Arbeiten im Admin-Backend mehr als 10 Autoren gleichzeitig? Nein, das ist eher bei Intranet-Applikationen die Regel.
  • Ist eine Überwachung der Referenziellen Integrität notwendig? Nein, weil es bei MySQL 4 noch keine Fremdschlüssel gibt.

Diese pauschale Beantwortung der Fragen trifft auf die meisten PHP Anwendungen zu. Die 3. Frage zielt auf die Granularität des Lockings ab. Ab 15 Autoren die gleichzeitig in einem Backend arbeiten, wirds schnell kriminell. Locking bedeutet, das die Tabelle bzw. der Datensatz für andere MySql Prozesse gesperrt wird, solange geschrieben wird.

Bei sehr vielen Änderungen, die gleichzeitig passieren sollen, ist ein fein granuliertes Locking oft die bessere Wahl. Arbeiten bis zu 10 Autoren gleichzeitig im System, sind die Wartezeitung oft auf wenige Millisekunden begrenzt und daher tolerierbar.

So prüft man, welche Storage-Engine einer Tabelle zugeordnet ist:

SHOW TABLE STATUS LIKE 'tabellen_name'

Man kann die Storage-Engine zur Laufzeit problemlos ändern:

ALTER TABLE `tabellen_name` TYPE=MYISAM

Das Fazit ist ganz klar: Wenn für die InnoDB Datenbank kein eigener leistungsfähiger Server genutzt wird, bietet sich auf dem klassischen Lampsystem auf jeden Fall nach wie vor die MyISAM Engine an. Muss die Anwendung Transaktionen unterstützen und ist die Referenzielle Integrität zu beachten, ist InnoDB die bessere Wahl - Dann aber auf einer MySQL 5 Plattform.

  • MisterWong
  • del.icio.us
  • Technorati
  • Digg
  • Slashdot
  • YahooMyWeb
  • Furl
  • Ma.gnolia
  • Spurl
  • Netscape
  • StumbleUpon
  • MyShare
  • blogmarks

PHP Blogger: Viel Freude und Ärger… - Ein PHP Blog auf deutsch meint dazu:

21. Dezember 2007 um 17:35

[...] MyISAM oder InnoDB [...]

RSS für Kommentare zu diesem Artikel · TrackBack URI

Schreib Deine Meinung