MySQL数据库运行一段时间后,部分业务表会因为数据不断累积变得体积庞大,不仅会拖慢查询效率,还会占用大量服务器存储资源。及时找出这些大表并合理清理,是数据库日常维护的重要工作。

通过information_schema查询大表
information_schema是MySQL自带的信息数据库,其中TABLES表存储了所有数据库表的元数据信息,我们可以通过查询这个表获取表的大小相关数据。
核心查询字段说明
TABLES表中和大表查询相关的核心字段如下:
- TABLE_SCHEMA:表所属的数据库名称
- TABLE_NAME:表名称
- DATA_LENGTH:表数据占用的字节数
- INDEX_LENGTH:表索引占用的字节数
- DATA_FREE:表碎片占用的字节数
表的总大小可以通过DATA_LENGTH + INDEX_LENGTH + DATA_FREE计算获得,单位默认是字节,我们可以转换为MB或GB方便查看。
查询所有大表的SQL语句
以下语句可以查询所有数据库中大小超过100MB的表,按总大小降序排列:
-- 查询大小超过100MB的表,按总大小降序排列
SELECT
TABLE_SCHEMA AS 数据库名,
TABLE_NAME AS 表名,
ROUND(DATA_LENGTH / 1024 / 1024, 2) AS 数据大小_MB,
ROUND(INDEX_LENGTH / 1024 / 1024, 2) AS 索引大小_MB,
ROUND(DATA_FREE / 1024 / 1024, 2) AS 碎片大小_MB,
ROUND((DATA_LENGTH + INDEX_LENGTH + DATA_FREE) / 1024 / 1024, 2) AS 总大小_MB
FROM information_schema.TABLES
WHERE TABLE_SCHEMA NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys')
AND (DATA_LENGTH + INDEX_LENGTH + DATA_FREE) / 1024 / 1024 > 100
ORDER BY 总大小_MB DESC;
如果需要查询指定数据库的大表,可以在WHERE条件中添加TABLE_SCHEMA = '你的数据库名'的筛选条件。
大表清理的常用方案
找到大表之后,需要根据表的业务属性选择合适的清理方式,避免误删重要数据。
清理冗余数据
如果表中存在大量无用的历史数据,比如超过3个月的日志表、已失效的临时数据,可以直接删除这些数据:
-- 删除超过3个月的无用日志数据,假设表中有create_time字段 DELETE FROM 数据库名.表名 WHERE create_time < DATE_SUB(NOW(), INTERVAL 3 MONTH);
注意如果删除的数据量非常大,建议分批删除,避免产生长事务锁表:
-- 分批删除数据,每次删除10000条 DELETE FROM 数据库名.表名 WHERE create_time < DATE_SUB(NOW(), INTERVAL 3 MONTH) LIMIT 10000;
归档历史数据
如果历史数据后续还有查询需求,不能直接删除,可以将旧数据迁移到归档表或者归档库中:
-- 创建归档表,结构和原表一致 CREATE TABLE 数据库名.表名_archive LIKE 数据库名.表名; -- 迁移超过1年的历史数据到归档表 INSERT INTO 数据库名.表名_archive SELECT * FROM 数据库名.表名 WHERE create_time < DATE_SUB(NOW(), INTERVAL 1 YEAR); -- 确认迁移完成后删除原表旧数据 DELETE FROM 数据库名.表名 WHERE create_time < DATE_SUB(NOW(), INTERVAL 1 YEAR);
清理表碎片
如果表的DATA_FREE值很大,说明表存在大量碎片,可以通过重建表的方式清理碎片:
-- 重建表,清理碎片,注意执行期间会锁表 ALTER TABLE 数据库名.表名 ENGINE = InnoDB;
对于数据量特别大的表,重建表会消耗较长时间,建议在业务低峰期执行。
删除无用的大表
如果确认表已经完全无用,可以直接删除整个表:
-- 删除整个表,操作不可逆,执行前务必确认 DROP TABLE 数据库名.表名;
清理注意事项
清理大表前一定要做好数据备份,避免误删数据无法恢复。执行删除或者重建表操作前,要确认当前没有业务正在访问该表,防止影响线上服务。如果表的数据量超过千万级,所有写操作都建议分批执行,减少数据库压力。
MySQLinformation_schema大表查询表清理修改时间:2026-07-15 16:54:25