¿Por qué la operación de eliminación de MySQL no libera espacio en el disco?

En InnoDB, la operación de eliminación en realidad no elimina los datos, Mysql en realidad solo marca los datos que se eliminarán y los marca como eliminados. El espacio ocupado por el disco no se reducirá, es decir, el espacio de la tabla no se libera realmente.

1. Varias situaciones en las que MySQL elimina datos y si se libera espacio en el disco

1. soltar, truncar

Libere inmediatamente espacio en disco, ya sea Innodb o MyISAM;
truncar tabla es en realidad un poco similar a soltar tabla y luego crear, pero el proceso de creación de tabla se ha optimizado, como que el archivo de estructura de tabla ya existe, etc. Por lo tanto, la velocidad debe ser cercana a la velocidad de la mesa de caída;

2. eliminar con condiciones

Para eliminar desde nombre_tabla donde xxx; eliminación condicional, ni innodb ni MyISAM liberarán espacio en disco;

3. eliminar sin condiciones

eliminar de table_name elimina todos los datos de la tabla. Para MyISAM, el espacio en disco se liberará inmediatamente (debe procesarse especialmente, lo cual es más razonable), e InnoDB no liberará espacio en disco;

2. Generación de fragmentos

  • Tanto la inserción como la actualización en MySQL pueden provocar la división de páginas, por lo que existe fragmentación.

  • Para una gran cantidad de ACTUALIZACIONES, también se producirá fragmentación de archivos. La unidad mínima de asignación de almacenamiento físico de Innodb es una página (página), y las ACTUALIZACIONES también pueden causar divisiones de páginas. Las divisiones de páginas frecuentes harán que las páginas se vuelvan escasas y se eliminen. Relleno irregular, por lo que los datos finales estarán fragmentados.

  • La declaración de eliminación en realidad simplemente marca los datos y los registra en una lista vinculada, formando así un espacio en blanco.

  • En InnoDB, al eliminar algunas filas, estas filas solo se marcan como "eliminadas", pero no se eliminan físicamente del índice, por lo que el espacio realmente no se libera ni se recupera. El hilo Purge de InnoDB limpiará de forma asincrónica estas filas y claves de índice inútiles.

  • Al realizar una operación de inserción, MySQL intentará utilizar el espacio vacío, pero si un cierto espacio vacío no ha sido ocupado por datos de un tamaño adecuado, aún no se puede ocupar por completo y se formará fragmentación;

3. Pensando en este diseño

1. La operación de eliminación de mysql es solo una marca lógica para la eliminación, y los datos en el disco en realidad no se eliminan.

2. Este diseño se debe a que: si es necesario reorganizar muchos otros registros en el disco después de eliminarlos, esto consumirá mucho rendimiento. (Por ejemplo: una tabla grande tiene un índice. Si se elimina una fila, toda la estructura del índice cambiará y los cambios posteriores en la estructura del índice inevitablemente provocarán E/S del disco)

3. Todos los registros eliminados formarán una lista enlazada basura y el espacio ocupado por los registros de la lista enlazada se denomina espacio reutilizable. Los registros recién insertados pueden sobrescribir este espacio.

Cuarto, cómo ver la fragmentación de la base de datos.

-- 查看数据库中每个存在碎片的表
select concat('optimize table ',table_schema,'.',table_name,';'),data_free,engine from information_schema.tables where data_free>0 and engine !='MEMORY';
--查看指定表的碎片情况
show table status like 't_user'

--找到碎片化最严重的表
SELECT table_schema, TABLE_NAME, concat(data_free/1024/1024, 'M') as data_free
FROM `information_schema`.tables
WHERE data_free > 3 * 1024 * 1024
    AND ENGINE = 'innodb'
ORDER BY data_free DESC

5. Cómo limpiar los escombros

  • alterar tabla tb_test motor=innodb

    Esta es en realidad una operación NULL. No hace nada en la superficie, pero en realidad reorganiza los fragmentos. Cuando se realiza una operación de optimización, lo que realmente se ejecuta es un comando ALTER vacío, pero este comando también desempeñará un papel en la optimización. Se reconstruirá toda la tabla, elimine el espacio vacío no utilizado.

  • optimizar la tabla xxx;

    La declaración OPTIMIZE TABLE puede reorganizar el almacenamiento físico de tablas e índices, reducir el espacio de almacenamiento y mejorar la eficiencia del acceso de E/S. Similar a la función de desfragmentación.
     
    MySQL puede liberar el espacio de la tabla a través de la declaración de optimización de la tabla, reorganizar las páginas físicas de los datos y los índices de la tabla, reducir el espacio ocupado por la tabla y optimizar el rendimiento de lectura y escritura. Utilice la sintaxis: OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG]
     
    TABLE
    tbl_name [, tbl_name]…

参考资料:
https://blog.csdn.net/levae1024/article/details/121791757
https://www.php.cn/mysql-tutorials-493459.html

转载自:https://www.luoxx.top/archives/mysql-free-disk

Supongo que te gusta

Origin blog.csdn.net/w_monster/article/details/128846673
Recomendado
Clasificación