MySQL Benchmark: MyISAM vs InnoDB – Blockstatements
Veröffentlicht: Oktober 21, 2009 Einsortiert unter: Benchmarks | Tags: Benchmark, InnoDB, MyISAM, MyISAM vs InnoDB, Mysql Schreibe einen Kommentar »In einem früheren Artikel habe ich Benchmarkergebnisse eines Vergleiches von MyISAM und InnoDB Tabellen veröffentlicht, bei denen jeweils 100 einzelne Inserts gemacht wurden. Jetzt habe ich einen Benchmark gemacht, der untersucht wie sich die beiden Tabellentypen verhalten, wenn man jeweils 100 Werte in einem Statement einfügt.
Der Versuchsaufbau:
- Wir legen folgende Tabellen an:
CREATE TABLE `test_insert_myisam` ( `a` INT UNSIGNED NOT NULL AUTO_INCREMENT , `b` INT NOT NULL , `c` VARCHAR( 255 ) NOT NULL , `d` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP , PRIMARY KEY ( `a` ) ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci
bzw.
CREATE TABLE `test_insert_inno` ( `a` INT UNSIGNED NOT NULL AUTO_INCREMENT , `b` INT NOT NULL , `c` VARCHAR( 255 ) NOT NULL , `d` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP , PRIMARY KEY ( `a` ) ) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_general_ci
- Anschließend werden 1000 Inserts vorgenommen, die alle ungefähr so aussehen:
INSERT INTO test_insert_inno (b,c) VALUES ('1078109503', '251ee7c0770ff96f42aafa2ba4ef8f96'), ('569061246', '9f311c4747961c27a8583bfc3d0b23bb'), ... 97 weitere Wertepaare ... ('130082118', 'f3c0d27820c3147f250ccfc85c61c82c')
- Es wird jeweils die Zeit gemessen, die für 100 Inserts benötigt wird. Das heißt das erste Messergebis ist die Zeit für die ersten 100 Zeilen, das zweite für die Zeilen 101 bis 200, usw.
- Implementiert ist die Logik in PHP 5.2.11 Und die verwendete MySQL-Version ist die 5.0.86
- Die MySQL Einstellungen sind die Standardeinstellungen.
Jeden Benchmark habe ich 30mal wiederholt und die Durchschnittswerte in der Grafik abgetragen.

Die Zeit für jeweils ein Insert-Statement bei dem 100 Werte hinzugefügt werden.
Ergebnisse:
- InnoDB braucht für 100 Inserts etwa 2 bis 20 mal so lange wie MyISAM.
- In beiden Kurven sind Ausreiser zu beobachten (und das obwohl die Werte den Mittelwert aus dreissig Messwerten darstellen). Die Ausreisser sind bei InnoDB ziemlich groß.
Im Prinzip scheint InnoDB nur 2 mal so lange zu brauchen wie MyISAM. Allerdings verwirren mich die massiven Aussreisser bei denen InnoDB 10 mal so lange gebraucht hat wie sonst.
Kritik:
- Die gemachten Benchmarks sind nur auf einer sehr einfachen Tabelle (mit nur einem Index und der ist auch noch ein autoindex-Feld).
Mysql Benchmark: Inserts in MyISAM und InnoDB
Veröffentlicht: Mai 10, 2009 Einsortiert unter: Benchmarks | Tags: Benchmark, InnoDB, MyISAM, Mysql Schreibe einen Kommentar »Wenn man sich über die verschiedenen Tabellentypen von MySQL informiert, stolpert man sehr bald über die Typen MyISAM und InnoDB. Und häufig liest man, dass MyISAM schneller sei als InnoDB, aber konkrete Messergebnisse werden nur sehr selten präsentiert.
Darum habe ich einmal gemessen, wie sich die beiden Tabellentypen bei vielen Inserts verhalten.
Der Versuchaufbau:
- Es wird folgene Tabelle angelegt:
CREATE TABLE `test_insert_myisam` (
`a` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`b` INT NOT NULL ,
`c` VARCHAR( 255 ) NOT NULL ,
`d` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
PRIMARY KEY ( `a` )
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci
bzw.
CREATE TABLE `test_insert_inno` (
`a` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`b` INT NOT NULL ,
`c` VARCHAR( 255 ) NOT NULL ,
`d` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
PRIMARY KEY ( `a` )
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_general_ci - Anschließend werden einige tausend inserts vorgenommen und zwar diese:
INSERT INTO test_insert_myisam (b,c) VALUES ( '$RAND', '$MD5RAND')
wobei $RAND eine per PHP erzeugte Zufallszahl ist und $MD5RAND der md5-Hash davon. - Es wird jeweils die Zeit gemessen, die für 100 Inserts benötigt wird. Das heißt das erste Messergebis ist die Zeit für die ersten 100 Zeilen, das zweite für die Zeilen 101 bis 200, usw.
- Das ganze machen wir insgesamt 1000-mal, so dass die Tabellen am Ende Einhunderttausend Zeilen haben.
- Implementiert ist die Logik in PHP 5.2.9. Und die verwendete MySQL-Version ist die 5.0.77
- Die MySQL Einstellungen sind die Standardeinstellungen.
Jeden Benchmark habe ich 30mal wiederholt und die Durchschnittswerte in der Grafik abgetragen.

Zeit für jeweils 100 Inserts in eine immer größer werdende Tabelle. Am Ende hat die Tabelle einhundertausen Einträge.
Ergebnisse:
- InnoDB braucht für 100 Inserts zehn mal so lange wie MyISAM.
- In beiden Kurven sind Ausreiser zu beobachten (und das obwohl die Werte den Mittelwert aus dreissig Messwerten darstellen). Die Ausreisser sind bei InnoDB häufiger und auch größer. Hier wäre es interessant zu sehen, ob dies auch bei anderen auftritt.
Es sieht so aus, als wäre InnoDB ein richtiger Performanz-Killer. Da stellt sich die Frage, ob einem die Transaktionssicherheit, Fremdschlüssel und Trigger die Performanzeinbußen wert sind.
Kritik:
- Die gemachten Benchmarks sind nur auf einer sehr einfachen Tabelle (mit nur einem Index und der ist auch noch ein autoindex-Feld).
- Für InnoDB wurden keine Transaktionen verwendet. Eventuell sieht das Ergebnis anders aus, wenn die 100 Zeilen nicht einzeln sondern in einer Transaktion eingefügt werden.