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 > 0
y construye una declaración SQL OPTIMIZE
solo 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 OPTIMIZE
comando. Algunos dicen que OPTIMIZE
no funcionará con las tablas de InnoDB y que necesita ejecutar ALTER TABLE table_name ENGINE=INNODB
. Otros dicen que en OPTIMIZE
realidad llama al ALTER TABLE
comando cuando se ejecuta contra tablas InnoDB. Con eso en mente, ejecuté el ALTER TABLE
comando contra una de las tablas de InnoDB identificadas como fragmentadas ( data_free > 0
) y descubrí que data_free
no 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 NULL
y no se devolvió ninguna. Todos son mayores que cero.
También ejecuté el OPTIMIZE
comando contra algunas MyISAM
tablas donde DATA_FREE
era 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.