Thomas Wiedmann http://www.twiedmann.de
• Sie befinden sich hier: Startseite > SQL-Backstube > MySQL ENGINE Unterschiede

Die SQL-Backstube

Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.

12.12.2010: MySQL ENGINE Unterschiede

Problemstellung

Typischerweise werden bei MySQL die ENGINE MyISAM oder InnoDB eingesetzt. Der wesentliche Vorteil von InnoDB ist die Transaktionssicherheit. Wer häufig "Multi-Row-Inserts" benutzt, sollte diesen Service zu schätzen wissen. Was hat nun ein "Multi-Row-Insert" mit Transaktionen zu tun? Eine ganze Menge, aber probieren wir es aus.


Getestet mit folgender Datenbank:

* MySQL 5.1.30


Testtabelle

Listing 1:

  1. /**
  2. * ENGINE MyISAM
  3. */
  4. CREATE TABLE test_insert_myisam (
  5. id INT NOT NULL,
  6. wert INT,
  7. PRIMARY KEY (id)
  8. ) ENGINE = MyISAM;
  9. /**
  10. * ENGINE InnoDB
  11. */
  12. CREATE TABLE test_insert_innodb (
  13. id INT NOT NULL,
  14. wert INT,
  15. PRIMARY KEY (id)
  16. ) ENGINE = InnoDB;

Multi-Row-Insert mit MyISAM

Fügen wir also fünf Datensätze in Form eines "Multi-Row-Insert" in die MyISAM-Tabelle ein. Die Testdaten enthalten einen Fehler in der 4. Zeile. Dort ist erneut der Primary Key (PK) mit dem Wert 3 vergeben. Was passiert, wenn der Befehl ausgeführt wird?

Listing 2:

  1. INSERT INTO test_insert_myisam VALUES
  2. (1, 10),
  3. (2, 20),
  4. (3, 30),
  5. (3, 40),
  6. (5, 50);
  7. ERROR 1062 (23000): Duplicate entry '3' for key 'PRIMARY'
  8. mysql>

Korrekterweise gibt es einen SQL-Fehler. Enthält die Tabelle nun Daten oder nicht? Schauen wir einfach nach.

Listing 3:

  1. SELECT * FROM test_insert_myisam;
  2. +----+------+
  3. | id | wert |
  4. +----+------+
  5. | 1 | 10 |
  6. | 2 | 20 |
  7. | 3 | 30 |
  8. +----+------+
  9. 3 rows in set (0.02 sec)

Tatsächlich sind Daten vorhanden, MySQL hat alle korrekten Daten bis zur dritten Zeile eingefügt. In der vierten Zeile kommt dann der provozierte SQL-Fehler, ab da fehlen die Daten.


Multi-Row-Insert mit InnoDB

Fügen wir also die selben fünf Datensätze in Form eines "Multi-Row-Insert" in die InnoDB-Tabelle ein. Die Testdaten enthalten einen Fehler in der 4. Zeile. Dort ist erneut der Primary Key (PK) mit dem Wert 3 vergeben. Was passiert, wenn der Befehl ausgeführt wird?

Listing 4:

  1. INSERT INTO test_insert_innodb VALUES
  2. (1, 10),
  3. (2, 20),
  4. (3, 30),
  5. (3, 40),
  6. (5, 50);
  7. ERROR 1062 (23000): Duplicate entry '3' for key 'PRIMARY'
  8. mysql>

Auch hier gibt es korrekterweise einen SQL-Fehler. Enthält die Tabelle nun Daten oder nicht? Probieren wir es aus.

Listing 5:

  1. SELECT * FROM test_insert_innodb;
  2. Empty set (0.00 sec)

In der InnoDB Tabelle sind keine Datensätze vorhanden. Der "Multi-Row-Insert" wird als atomarer Block betrachtet und nach dem Motto "Alles oder nichts" behandelt. Es gab einen SQL-Fehler und somit wird der komplette Block abgelehnt und der ursprüngliche Tabelleninhalt wieder hergestellt.


Resumee

MyISAM ist zwar die Standard-Speicher-Engine bei MySQL, aber wer auf Datenqualität angewiesen ist, ist gut beraten einen genauen Blick auf die Commit, Rollback Funktionalität der InnoDB Engine zu werfen.




Sitemap - Inhaltsverzeichnis

© 2002-2017 by Thomas Wiedmann : kontakt (at) twiedmann (punkt) de (Stand : 11.01.2015).