la respuesta corta:
select ENGINE, TABLE_NAME,Round( DATA_LENGTH/1024/1024) as data_length , round(INDEX_LENGTH/1024/1024) as index_length, round(DATA_FREE/ 1024/1024) as data_free from information_schema.tables where DATA_FREE > 0;
La respuesta "Debe saber"
En primer lugar, debe comprender que las tablas Mysql se fragmentan cuando se actualiza una fila, por lo que es una situación normal. Cuando se crea una tabla, digamos importada usando un volcado con datos, todas las filas se almacenan sin fragmentación en muchas páginas de tamaño fijo. Cuando actualiza una fila de longitud variable, la página que contiene esta fila se divide en dos o más páginas para almacenar los cambios, y estas nuevas dos (o más) páginas contienen espacios en blanco que llenan el espacio no utilizado.
Esto no afecta el rendimiento, a menos que, por supuesto, la fragmentación crezca demasiado. ¿Qué es demasiada fragmentación? Bueno, veamos la consulta que está buscando:
select ENGINE, TABLE_NAME,Round( DATA_LENGTH/1024/1024) as data_length , round(INDEX_LENGTH/1024/1024) as index_length, round(DATA_FREE/ 1024/1024) as data_free from information_schema.tables where DATA_FREE > 0;
DATA_LENGTH e INDEX_LENGTH son el espacio que usan sus datos e índices, y DATA_FREE es la cantidad total de bytes no utilizados en todas las páginas de la tabla (fragmentación).
Aquí hay un ejemplo de una tabla de producción real
| ENGINE | TABLE_NAME | data_length | index_length | data_free |
| InnoDB | comments | 896 | 316 | 5 |
En este caso tenemos una tabla que usa (896 + 316) = 1212 MB, y tenemos datos en un espacio libre de 5 MB. Esto significa una "relación de fragmentación" de:
5/1212 = 0.0041
... que es una "relación de fragmentación" realmente baja.
He estado trabajando con tablas con una proporción cercana a 0.2 (es decir, el 20% de los espacios en blanco) y nunca noto una desaceleración en las consultas, incluso si optimizo la tabla, el rendimiento es el mismo. Pero aplicar una tabla de optimización en una tabla de 800 MB lleva mucho tiempo y bloquea la tabla durante varios minutos, lo que no es posible en la producción.
Entonces, si considera lo que gana en rendimiento y el tiempo perdido en optimizar una tabla, prefiero NO OPTIMIZAR.
Si cree que es mejor para el almacenamiento, vea su relación y vea cuánto espacio puede ahorrar al optimizar. Por lo general, no es demasiado, así que prefiero NO OPTIMIZAR.
Y si optimiza, la próxima actualización creará espacios en blanco al dividir una página en dos o más. Pero es más rápido actualizar una tabla fragmentada que una no fragmentada, porque si la tabla está fragmentada, una actualización en una fila no necesariamente dividirá una página.
Espero que esto te ayude.