— 查看所有数据库容量大小
SELECT table_schema AS '数据库', sum( table_rows ) AS '记录数', sum( TRUNCATE ( data_length / 1024 / 1024, 2 ) ) AS '数据容量(MB)', sum( TRUNCATE ( index_length / 1024 / 1024, 2 ) ) AS '索引容量(MB)' FROM information_schema.TABLES GROUP BY table_schema ORDER BY sum( data_length ) DESC, sum( index_length ) DESC;
— 查看所有数据库各表容量大小
SELECT table_schema AS '数据库', table_name AS '表名', table_rows AS '记录数', TRUNCATE ( data_length / 1024 / 1024, 2 ) AS '数据容量(MB)', TRUNCATE ( index_length / 1024 / 1024, 2 ) AS '索引容量(MB)' FROM information_schema.TABLES ORDER BY data_length DESC, index_length DESC;
— 查看指定数据库容量大小
SELECT table_schema AS '数据库', sum( table_rows ) AS '记录数', sum( TRUNCATE ( data_length / 1024 / 1024, 2 ) ) AS '数据容量(MB)', sum( TRUNCATE ( index_length / 1024 / 1024, 2 ) ) AS '索引容量(MB)' FROM information_schema.TABLES WHERE table_schema = 'sys';
— 查看指定数据库各表容量大小
SELECT table_schema AS '数据库', table_name AS '表名', table_rows AS '记录数', TRUNCATE ( data_length / 1024 / 1024, 2 ) AS '数据容量(MB)', TRUNCATE ( index_length / 1024 / 1024, 2 ) AS '索引容量(MB)' FROM information_schema.TABLES WHERE table_schema = 'sys' -- 查看mysql库各表容量大小 ORDER BY data_length DESC, index_length DESC;
–查询某库中所有表碎片空间大小
SELECT CONCAT( table_schema, '.', table_name ) AS TABLE_NAME, ENGINE AS TABLE_ENGINE, table_type AS TABLE_TYPE, table_rows AS TABLE_ROWS, CONCAT( ROUND( data_length / ( 1024 * 1024 ), 2 ), 'M' ) AS TB_DATA_SIZE, CONCAT( ROUND( index_length / ( 1024 * 1024 ), 2 ), 'M' ) AS TB_IDX_SIZE, CONCAT( ROUND(( data_length + index_length ) / ( 1024 * 1024 ), 2 ), 'M' ) AS TOTAL_SIZE, CASE WHEN data_length = 0 THEN 0 ELSE ROUND( index_length / data_length, 2 ) END AS TB_INDX_RATE, CONCAT( ROUND( data_free / 1024 / 1024, 2 ), 'MB' ) AS TB_DATA_FREE, CASE WHEN ( data_length + index_length ) = 0 THEN 0 ELSE ROUND( data_free /( data_length + index_length ), 2 ) END AS TB_FRAG_RATE FROM information_schema.TABLES WHERE table_schema = '库名' AND ROUND( DATA_FREE / 1024 / 1024, 2 ) >= 50 ORDER BY data_free DESC;
— 清理碎片空间 相关链接
mysql> OPTIMIZE TABLE 表名;
对于 InnoDB 存储引擎,OPTIMIZE TABLE 实际上被映射为 ALTER TABLE … FORCE 命令,该命令会重建表以更新索引统计信息并释放聚簇索引中的未使用空间。当您在一个表上运行 OPTIMIZE TABLE 命令时,它在输出中显示为以下形式:
mysql> OPTIMIZE TABLE foo;
+----------+----------+----------+-------------------------------------------------------------------+ | Table | Op | Msg_type | Msg_text | +----------+----------+----------+-------------------------------------------------------------------+ | test.foo | optimize | note | Table does not support optimize, doing recreate + analyze instead | | test.foo | optimize | status | OK | +----------+----------+----------+-------------------------------------------------------------------+ 这表示 OPTIMIZE TABLE 命令正在处理 InnoDB 表,并执行相应的操作来优化表的性能和空间利用。 看着别扭的话 直接跳官网吧(
)
OPTIMIZE TABLE 使用在线 DDL 来重建常规表和分区表,从而减少并发 DML 操作的停机时间。由 OPTIMIZE TABLE 触发的表重建是原地完成的。在操作的准备阶段和提交阶段只会短暂地获取排他性表锁。在准备阶段期间,元数据将被更新,并创建一个中间表。在提交阶段期间,表元数据更改将被提交。
InnoDB 在以下情况下,OPTIMIZE TABLE 使用表复制方法来重建表:
- 当启用了 old_alter_table 系统变量时。
- 当服务器以 –skip-new 选项启动时。
不支持对包含索引的表使用在线 DDL 进行 OPTIMIZE TABLE。而是使用表复制方法。InnoDB FULLTEXT
InnoDB 使用页面分配方法存储数据,并且不像旧版存储引擎(如 MyISAM)那样容易出现碎片化。在考虑是否运行 OPTIMIZE TABLE 时,请考虑服务器预计要处理的事务工作负载:MyISAM OPTIMIZE TABLE
- 期望存在一定程度的碎片。为了避免分裂页面,只将页面填充到 93% 的位置,以便在无需分裂页面的情况下进行更新。InnoDB
- 删除操作可能会留下间隙,使得页面填充程度低于期望值,这可能值得优化表。
- 根据数据类型和行格式,对行的更新通常会在同一页面内重写数据,只要有足够的空间。请参阅第 14.9.1.5 节“InnoDB 表的压缩原理”和第 14.11 节“InnoDB 行格式”。
- 高并发工作负载随着时间的推移可能会在索引中留下间隙,因为通过其 MVCC 机制保留了相同数据的多个版本。请参阅第 14.3 节“InnoDB 多版本”。InnoDB
MyISAM 详细信息 对于表,OPTIMIZE TABLE 的工作原理如下:MyISAM
- 如果表中存在已删除或拆分的行,则修复该表。
- 如果索引页面未排序,则对其进行排序。
- 如果表的统计信息未更新(且无法通过对索引排序来完成修复),则更新它们。