MySQL: Langsames „ALTER TABLE“?

neulich musste ich die Struktur einer Tabelle mit 20.000 Einträgen mittels phpMyAdmin ändern. Ein als „text“ definiertes Feld stellte sich als zu kurz heraus und musste in „mediumtext“ geändert werden. Dabei kommt ein mySQL-Befehl wie dieser heraus (sichtbar mit „SQL Vorschau“):

ALTER TABLE `tabelle` CHANGE `spalte` `spalte` MEDIUMTEXT CHARACTER SET utf8 COLLATE utf8_general_ci; 

Da die Anzahl der Datensätze nun nicht besonders groß ist, hoffte ich auf ein paar Sekunden Verarbeitungszeit. Weit gefehlt – wenigsten 10 Minuten war der Rechner am Arbeiten, sodass inzwischen sogar mehrmals die 23 Sekunden PHP-Laufzeit (phpMyAdmin läuft mit PHP) überschritten wurde und der Browser die Verbindung verlor. Lediglich die HD-Lampe verriet mir, dass die Sache noch im Gang war.

Später machte ich die gleiche Sache auch beim Kunden und bat die Mitarbeiter, die Finger von den tasten zu nehmen. Allerdings dauerte der Vorgang dort dann wirklich nur vielleicht 2 Sekunden. Hä?

Ich bin der Sache auf den Grund gegangen. Es liegt nicht an mySQL, auch nicht an PHP oder am Webserver. Es lag hier an der unterschiedlichen Hardwareausstattung beider Systeme! Beim Kunden läuft ein „richtiger Server“ mit viel Speicher und Tempo, bei mir nur eine etwas zu schmale Workstation mit einem Prozessor mit 2×2 GHz und 6 GB RAM.

Ein ALTER TABLE erfordert ein mehrfaches Umkopieren des gesamten Inhalts der Tabelle und ein umfängliches Handling der Indexe. Das dauert auf einer schmalen maschine eben bedeutend länger und erfordert vielleicht sogar noch Auslagerungen von Speicher. Möglicherweise kommt es auch darauf an, wie PHP und mySQL an den Webserver angebunden sind (?).

Hier bei Stackoverflow wird die Sache gut beschrieben und einige Tips sind auch dabei.

Dass mein Frontend abgeschossen wurde, weil die Laufzeit zu lang wird, hat nicht geschadet – als die HD-Lampe endlich aus blieb, reichte ein Reload und phpMyAdmin war wieder da.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.