He estado investigando cómo optimizar solo tablas fragmentadas en MySQL y revisé esta publicación sobre la optimización de tablas . Básicamente realiza una consulta en la base de datos information_schema para cualquier tabla con data_free > 0y construye una declaración SQL OPTIMIZEsolo para esas tablas. Ejecuté esta consulta e identificó 148 tablas para la optimización. Todas las tablas identificadas son tablas InnoDB. Después de ejecutar el script SQL de optimización resultante, volví a ejecutar el script original para identificar tablas fragmentadas y devolvió exactamente las mismas tablas durante el primer paso.
He visto publicaciones contradictorias con respecto a las tablas de InnoDB y el OPTIMIZEcomando. Algunos dicen que OPTIMIZEno funcionará con las tablas de InnoDB y que necesita ejecutar ALTER TABLE table_name ENGINE=INNODB. Otros dicen que en OPTIMIZErealidad llama al ALTER TABLEcomando cuando se ejecuta contra tablas InnoDB. Con eso en mente, ejecuté el ALTER TABLEcomando contra una de las tablas de InnoDB identificadas como fragmentadas ( data_free > 0) y descubrí que data_freeno cambió después. Todavía es mayor que 0. También reinicié MySQL y lo comprobé solo para encontrar los mismos resultados.
Ahora, tenemos varios servidores que ejecutan MySQL 5.5.29 en nuestra organización y ejecuté una consulta en todos ellos para identificar las tablas de InnoDB DATA_FREE=0 or NULLy no se devolvió ninguna. Todos son mayores que cero.
También ejecuté el OPTIMIZEcomando contra algunas MyISAMtablas donde DATA_FREEera mayor que cero y luego verifiqué que era cero.
¿Alguien puede arrojar algo de luz sobre esto por mí? ¿Cuál es el método adecuado para eliminar la fragmentación de las tablas de InnoDB? ¿Cuál es el método adecuado para determinar tablas fragmentadas de InnoDB?
Gracias
fuente

innodb_file_per_table, también mostrará el mismo valor para cada tabla en el espacio de tabla compartido.