2010-01-18 8 views
13

Ich habe eine 12 GB-Tabelle voller Bilder, ich versuche, die Blob-Spalte, die die Daten enthält, umzubenennen, und es dauert ewig. Kann mir jemand einen Schlag nach dem anderen geben, warum es so lange dauert, die Spalte umzubenennen? Ich hätte gedacht, dass diese Operation ziemlich schnell sein würde, unabhängig von der Größe des Tisches?Warum dauert es so lange, eine Spalte in mysql umzubenennen?

EDIT: Die Abfrage I lief als

alter table `rails_production`.`pictures` change `data` `image_file_data` mediumblob NULL 

folgt Es scheint, dass die meiste Zeit verbrachte wartet mysql eine temporäre Kopie der Bilder Tisch zu machen, die, da sie sehr groß ist nimmt eine Weile zu tun.

Es ist auf der Liste der Dinge zu tun, um den Bildspeicher von der Datenbank in das Dateisystem zu ändern.

EDIT2: Mysql Server-Version: 5.0.51a-24 + lenny2 (Debian)

+1

könnte eine gute Idee sein, die genaue Abfrage schreiben Sie lief. – nos

+1

vielleicht sind das die Gründe, warum ich gesehen habe, wie man Bilder in einer DB speichert * normalerweise * sage 'Bilder im Dateisystem speichern und Links zu den Bildern in der DB'. – pavium

+0

@ Janak: Welche Version von MySQL verwenden Sie? – outis

Antwort

10

Ich kann Ihnen nicht die Blow-by-Blow (Feature-Anfrage #34354 würde helfen, außer dass es wahrscheinlich nicht zurück zu MySQL 5.0 portiert werden würde), aber die zusätzliche Zeit ist aufgrund der Tatsache, dass ein ALTER ... CHANGE kann den Typ der Spalte (und gegebenenfalls die Spaltenattribute) ändern, wodurch die in der Spalte gespeicherten Werte und andere Prüfungen konvertiert werden müssen. MySQL 5.0 enthält keine Optimierungen, wenn der neue Typ und die neuen Attribute mit denen des alten identisch sind. Aus der Dokumentation für ALTER unter MySQL 5.0:

In den meisten Fällen funktioniert ALTER TABLE durch Erstellen einer temporären Kopie der ursprünglichen Tabelle. Die Änderung wird an der Kopie durchgeführt, und dann wird die ursprüngliche Tabelle gelöscht und die neue umbenannt. Während ALTER TABLE ausgeführt wird, ist die ursprüngliche Tabelle für andere Sitzungen lesbar. Aktualisierungen und Schreibvorgänge in der Tabelle werden angehalten, bis die neue Tabelle bereit ist. Anschließend werden sie automatisch in die neue Tabelle ohne fehlgeschlagene Aktualisierungen umgeleitet.

[...]

Wenn Sie irgendeine Option TABLE andere als RENAME ALTEN, MySQL erstellt immer eine temporäre Tabelle, auch wenn die Daten nicht genau kopiert werden müßten (zB wenn Sie ändern der Name einer Spalte).

Under 5.1, ALTER einige zusätzliche Optimierungen hat:

In einigen Fällen keine temporäre Tabelle ist notwendig:

  • Änderungen, die nur die Metadaten der Tabelle ändern und nicht die Tabellendaten sein kann, sofort gemacht, indem Sie die .frm-Datei der Tabelle ändern und den Tabelleninhalt nicht berühren.Folgende Änderungen sind schnell Veränderungen, die auf diese Weise hergestellt werden können:

    • eine Spalte umbenennen, mit Ausnahme der Speicher-Engine InnoDB.

[...]

+6

Umbenennen einer Spalte, mit Ausnahme der InnoDB-Speicher-Engine. :( – pjb3

+0

Guter Punkt pjb3. Nicht sicher, ob es seit dem ursprünglichen Beitrag geändert wurde, aber ich bearbeitete die Antwort, um die MySQL-Dokumentation widerzuspiegeln. Wie Sie sagen, wird diese Technik NICHT für innodb unterstützt. – DougW

+0

Ich weiß, dass Sie diese Antwort gepostet haben zurück im Jahr 2010, aber seither hat MySQL 5.6 eine Menge neuer Fälle hinzugefügt, in denen es ALTER in-Place tun kann, siehe http://dev.mysql.com/doc/refman/5.6/en/innodb-online-ddl. html –

7

Da MySQL wird die gesamte Tabelle neu erstellen, wenn Sie Schemaänderungen vornehmen.

Dies wird getan, weil es die einzige Möglichkeit ist, dies in einigen Fällen zu tun, und es dem Server viel einfacher macht, es trotzdem wieder aufzubauen.

2

Ja mysql erstellt eine temporäre Kopie der Tabelle. Ich glaube nicht, dass es einen leichten Weg dafür gibt. Sie sollten wirklich darüber nachdenken, die Bilder im Dateisystem zu speichern und nur Pfade in mysql zu speichern. Das ist der einzige Weg, um es zu befestigen, denke ich.

Verwandte Themen