2010-01-18 18 views
13

Tengo una tabla de 12 GB llena de imágenes, estoy tratando de cambiar el nombre de la columna de blob que contiene los datos, y me está tomando una eternidad. ¿Puede alguien darme una ojeada por qué se está tardando tanto en cambiar el nombre de la columna? Pensé que esta operación sería bastante rápida, sin importar el tamaño de la mesa.¿Por qué tarda tanto en cambiar el nombre de una columna en mysql?

EDIT: La consulta me encontré es el siguiente

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

Parece que la mayor parte del tiempo se dedica a la espera de MySQL para hacer una copia temporal de la tabla imágenes, que ya es muy grande se está llevando un tiempo para hacer.

Está en la lista de cosas que hacer, para cambiar el almacenamiento de la imagen de la base de datos al sistema de archivos.

Edit2: MySQL Server versión: 5.0.51a-24 + lenny2 (Debian)

+1

podría ser una buena idea para publicar la consulta exacta que ejecutó. – nos

+1

quizás esta es la razón por la cual las preguntas que he visto sobre cómo almacenar imágenes en una base de datos * normalmente * dicen 'almacenar imágenes en el sistema de archivos y enlaces a las imágenes en la base de datos'. – pavium

+0

@Janak: ¿qué versión de MySQL estás usando? – outis

Respuesta

10

No puedo darle el golpe por golpe (la solicitud de función #34354 ayudaría, excepto que probablemente no sería retransportada a MySQL 5.0), pero el tiempo adicional se debe al hecho de que una ALTER ... CHANGE puede cambiar el tipo de la columna (y los atributos de la columna, si corresponde), lo que requiere la conversión de los valores almacenados en la columna y otras comprobaciones. MySQL 5.0 no incluye optimizaciones para cuando el nuevo tipo y atributos son los mismos que los antiguos. De la documentación para ALTER bajo MySQL 5.0:

En la mayoría de los casos, ALTER TABLE funciona haciendo una copia temporal de la tabla original. La alteración se realiza en la copia, y luego se elimina la tabla original y se renombra la nueva. Mientras se ejecuta ALTER TABLE, otras sesiones pueden leer la tabla original. Las actualizaciones y escrituras en la tabla se detienen hasta que la nueva tabla esté lista, y luego se redirigen automáticamente a la nueva tabla sin actualizaciones fallidas.

[...]

Si usa cualquier opción de ALTER TABLE que no sea RENAME, MySQL siempre crea una tabla temporal, incluso si no necesitarían estrictamente los datos a copiar (por ejemplo, cuando se cambia el nombre de una columna).

Bajo 5.1, ALTER tiene algunas optimizaciones adicionales:

En algunos casos, no hay ninguna tabla temporal es necesaria:

  • Las alteraciones que modifican la única metadatos de la tabla y no datos de la tabla puede haber hecho inmediatamente alterando el archivo .frm de la tabla y sin tocar el contenido de la tabla.Los siguientes cambios son alteraciones rápidas que se pueden hacer de esta manera:

    • Cambiar el nombre de una columna, a excepción de la motor de almacenamiento InnoDB.

[...]

+6

Cambiar el nombre de una columna, a excepción del motor de almacenamiento InnoDB. :( – pjb3

+0

Buen punto pjb3. No estoy seguro de si ha cambiado desde la publicación original, pero edité la respuesta para reflejar la documentación de MySQL. Como dices, esta técnica NO parece ser compatible con innodb. – DougW

+0

Me doy cuenta de que has publicado esta respuesta en 2010, pero desde entonces MySQL 5.6 ha agregado muchos casos nuevos en los que puede implementar ALTER. Consulte http://dev.mysql.com/doc/refman/5.6/en/innodb-online-ddl. html –

7

Debido a que MySQL reconstruirá toda la tabla cuando se realizan cambios de esquema.

Esto se hace porque es la única manera de hacerlo en algunos casos, y hace que sea mucho más fácil para el servidor reconstruirlo de todos modos.

2

Sí mysql hace una copia temporal de la tabla. No creo que haya una manera fácil de evitar eso. Deberías pensar en almacenar las imágenes en el sistema de archivos y solo almacenar rutas en mysql. Esa es la única forma de apretarlo, supongo.

Cuestiones relacionadas