¿Qué significa "La tabla no es compatible con la optimización, haciendo recrear + analizar en su lugar"?


97

Estoy trabajando en MySQL 5.5 e intento reconstruir el índice usando una OPTIMIZE TABLEconsulta. Recibo el siguiente error:

La tabla no admite optimizar, en su lugar, hacer recrear + analizar

¿Qué significa esto? ¿El motor MySQL no permite la reconstrucción de índices? ¿Qué se está haciendo detrás de este mensaje, en el nivel del motor MySQL 5.5?

Respuestas:


190

Eso es realmente un mensaje informativo.

Es probable que esté haciendo OPTIMIZE en una tabla InnoDB (tabla que usa el motor de almacenamiento InnoDB, en lugar del motor de almacenamiento MyISAM ).

InnoDB no admite OPTIMIZE como lo hace MyISAM. Hace algo diferente. Crea una tabla vacía y copia todas las filas de la tabla existente en ella, y esencialmente elimina la tabla anterior y cambia el nombre de la tabla nueva, y luego ejecuta ANALYZE para recopilar estadísticas. Eso es lo más cerca que puede estar InnoDB de hacer una OPTIMIZAR.

El mensaje que está recibiendo es básicamente el servidor MySQL repitiendo lo que el motor de almacenamiento InnoDB le dijo al servidor MySQL:

La tabla no admite optimizar es el motor de almacenamiento InnoDB que dice ...

"Yo (el motor de almacenamiento InnoDB) no hago una operación de OPTIMIZO como lo hace mi amigo (el motor de almacenamiento MyISAM)".

"Hacer recrear + analizar en su lugar" es el motor de almacenamiento InnoDB que dice ...

"He decidido realizar un conjunto diferente de operaciones que lograrán un resultado equivalente".


13
ok, ¿podría compartir la forma diferente en que lo está haciendo?
Vikrant More

Estoy seguro de que esto está en alguna parte del Manual de referencia de MySQL; este es el comportamiento esperado y no hay nada de qué preocuparse. (Excepto que la tabla estará "bloqueada" y no estará disponible mientras el proceso se completa, lo que puede llevar un tiempo para una tabla HUGH JASS). Referencia: https://dev.mysql.com/doc/refman/5.5/ es / optimize-table.html Consulte la sección "Detalles de InnoDB".
spencer7593

También puede utilizar MySQL Workbench para realizar la optimización de la tabla. Consulte la documentación del Inspector de tablas y esquemas para obtener información adicional. Observe la opción "Optimizar tabla".
Philip Olson

1
Excelente explicación para personas que se están iniciando en db world. Muchas gracias
tachomi

5
Tenga cuidado: no use esto si tiene poco espacio en el disco, ya que es probable que su servidor se agote al intentar recrear la tabla muy grande.
Danny Staple

22

OPTIMIZE TABLEfunciona bien con el motor InnoDB de acuerdo con el artículo de soporte oficial: http://dev.mysql.com/doc/refman/5.5/en/optimize-table.html

Notará que optimizar las tablas InnoDB reconstruirá la estructura de la tabla y actualizará las estadísticas del índice (algo así como ALTER TABLE).

Tenga en cuenta que este mensaje podría ser solo una mención informativa y la información muy importante es el estado de su consulta: ¡simplemente OK!

mysql> OPTIMIZE TABLE foo;
+----------+----------+----------+-------------------------------------------------------------------+
| Table    | Op       | Msg_type | Msg_text                                                          |
+----------+----------+----------+-------------------------------------------------------------------+
| test.foo | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| test.foo | optimize | status   | OK                                                                |
+----------+----------+----------+-------------------------------------------------------------------+

2
Realmente no, MySQL dará la razón del error: falla de escritura de archivo temporal, operación fallida.
iwind

8

La mejor opción es crear una nueva tabla con las mismas propiedades

CREATE TABLE <NEW.NAME.TABLE> LIKE <TABLE.CRASHED>;
INSERT INTO <NEW.NAME.TABLE> SELECT * FROM <TABLE.CRASHED>;

Cambiar el nombre de NEW.NAME.TABLE y TABLE.CRASH

RENAME TABLE <TABLE.CRASHED> TO <TABLE.CRASHED.BACKUP>;
RENAME TABLE <NEW.NAME.TABLE> TO <TABLE.CRASHED>;

Después de trabajar bien, eliminar

DROP TABLE <TABLE.CRASHED.BACKUP>;

2
¿Este método mantiene índices y disparadores?
Joel Murphy

1
Sí, por supuesto. ¡Todos ellos! Puede probarlo y luego usar phpMyAdmin para verificar nuevamente
tquang

1
Esto no recrea la clave externa.
DanB

1

La mejor opción es crear una nueva tabla, copiar las filas a la tabla de destino, eliminar la tabla real y cambiar el nombre de la tabla recién creada. Este método es bueno para mesas pequeñas,


3
Sugeriría armar un código de ejemplo para acompañar su respuesta. Eche un vistazo a cómo escribo una buena respuesta
Viernes
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.