Reparar InnoDB no es tan trivial como hacer clic en un botón. MyISAM es.
Bajo el capó, OPTIMIZE TABLE lo harán a una tabla MyISAM llamada mitb:
- Crear tabla temporal vacío con misma estructura que mitb
datos
- Copia MyISAM de mitb en la tabla temporal
- gota mitb tabla tabla temporal
- Cambiar nombre para mitb
- Run ANALYZE TABLE contra mitb estadísticas e índices tienda
Optmize TABLE no funciona de esa manera con InnoDB por dos razones principales:
Razón # 1: Disposición de almacenamiento InnoDB
Por defecto, InnoDB tiene innodb_file_per_table discapacitados. Todo InnoDB y su abuela aterrizan en ibdata1. Correr OPTIMIZE TABLE hace lo siguiente a una tabla InnoDB llamada mitb:
- Crear tabla InnoDB temp vacío con misma estructura que mitb
- los datos de copia de InnoDB de mitb en la tabla temporal
mesa
- gota mitb
- Cambiar el nombre de tabla temporal a mitb
- Ejecutar ANALYZE TABLE contra mitb estadísticas e índices tienda
Desafortunadamente, la tabla temporal utilizada para reducir mytb se agrega a ibdata1. CRECIMIENTO INSTANTÁNEO PARA ibdata1 !!! A la luz de esto, ibdata1 nunca se reducirá. Para empeorar las cosas, ANALYZE TABLE es inútil (Explicado en la RAZÓN # 2)
Si tiene innodb_file_per_table habilitada, los primeros cuatro (4) pasos funcionarán dado que los datos no se almacenan en ibdata1, sino en un archivo de espacio de tablas externo llamado mytb.ibd. Eso puede encogerse.
RAZÓN # 2: Índice de Estadística se vuelven a calcular siempre
InnoDB no almacena de manera efectiva estadísticas de índice. De hecho, si ejecuta ANALYZE TABLE en mytb, las estadísticas se crean y almacenan. Desafortunadamente, por diseño, InnoDB se sumergirá en las páginas BTREE de sus índices, guessimate cardinalidades clave, y usa esos números para preparar MySQL Query Optimizer. Este es un proceso en marcha. En efecto, ANALYZE TABLE es inútil porque las estadísticas de índice calculadas se sobrescriben con cada consulta ejecutada en esa tabla.I wrote about this in the DBA StackExchange June 21, 2011.
Percona explained this thoroughly in www.mysqlperformanceblog.com
cuanto a gastos generales en MyISAM, ese número puede ser resuelto.
Para una tabla MyISAM, la sobrecarga representa la fragmentación interna. Esto es bastante común en una tabla que experimenta, INSERTAR, ACTUALIZAR y SUPRIMIR, especialmente si tiene datos BLOB o columnas VARCHAR. La ejecución de OPTIMIZE TABLE hace que esa fragmentación desaparezca copiando en una tabla temporal (naturalmente, no copia espacio vacío).
Volviendo a InnoDB, ¿cómo se puede eliminar efectivamente el espacio perdido? Debe volver a crear ibdata1 para contener menos información. Withing ibdata1 tiene cuatro tipos de datos:
- Tabla de Datos Páginas
- Índice de datos Páginas
- tabla de metadatos
- MVCC de datos para transacciones
Puede mover permamnently tabla y los índices de salida de ibdata1 para siempre ¿Qué pasa con los datos y los índices que ya están alojados en ibdata1?
Siga el plan de limpieza InnoDB que yo publicada el 29 de octubre de 2010: Howto: Clean a mysql InnoDB storage engine?
No actualicé o inserté o eliminé nada, acabo de cambiar myisam a innodb, luego el valor de sobrecarga subió a 3,072.0KiB y el valor de efectividad bajó a -3,129,344. ¿Es normal? ¿O realmente tengo que configurar algo antes de cambiar myisam a innodb para evitar problemas generales/efectivos? – zac1987
@ zac1987 esta respuesta parece demasiado tarde, pero puede intentar OPTIMIZAR LA TABLA antes de cambiarla a InnoDB. – Raptor