MySQL表空间碎片怎么查?一文教你清理磁盘碎片

 更新时间:2026年08月19日 11:50:41   作者:promise524  
还在为MySQL表空间碎片烦恼吗?本文详细讲解如何查询表空间使用情况和磁盘碎片,教你使用OPTIMIZE TABLE命令清理碎片,并分享Shell脚本自动优化,让数据库保持高效运行

1. 查询 MySQL 表空间和磁盘碎片

查询表空间使用情况

使用以下 SQL 语句可以查看数据库中各个表的表空间使用情况,

包括数据大小、索引大小和空闲空间(碎片):

SELECT 
    table_schema AS `Database`, 
    table_name AS `Table`, 
    ROUND(data_length / 1024 / 1024, 2) AS `Data Size (MB)`, 
    ROUND(index_length / 1024 / 1024, 2) AS `Index Size (MB)`, 
    ROUND(data_free / 1024 / 1024, 2) AS `Free Space (MB)`
FROM 
    information_schema.tables
WHERE 
    table_schema NOT IN ('information_schema', 'performance_schema', 'mysql', 'sys')
ORDER BY 
    data_length + index_length DESC;

分析磁盘碎片

通过检查 data_free 列的值,可以判断表中是否存在碎片。

如果 data_free 值较大,意味着表中存在未使用的空间,即磁盘碎片。

2. 优化表空间和清理磁盘碎片

使用 OPTIMIZE TABLE 命令可以优化表空间,清理磁盘碎片。

这会重新组织表的数据并回收未使用的空间:

OPTIMIZE TABLE your_table_name;

如果想要对整个数据库中的所有表进行优化,可以使用如下 SQL 脚本:

SET @tables = NULL;
SELECT GROUP_CONCAT(table_name) INTO @tables
FROM information_schema.tables 
WHERE table_schema = 'your_database_name' AND table_type = 'BASE TABLE';

SET @tables = CONCAT('OPTIMIZE TABLE ', @tables);
PREPARE stmt FROM @tables;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

3. 表空间和磁盘碎片分析

在数据库存在大量数据插入和删除操作时,表的碎片可能会逐渐增多。定期分析表空间和碎片是必要的。分析结果可以帮助确定哪些表需要优化。

可以根据 data_free 列的值来评估碎片情况,或者使用 SHOW TABLE STATUS 命令查看特定表的碎片和空间使用情况:

SHOW TABLE STATUS LIKE 'your_table_name';

4. 自动清理碎片

可以使用 innodb_file_per_table 选项来使每个表都有独立的表空间,从而减少表空间碎片的产生。

确保在 MySQL 配置文件 (my.cnf 或 my.ini) 中启用该选项:

[mysqld]
innodb_file_per_table=1

5. 使用 Shell 脚本定期清理表空间和磁盘碎片

使用 Shell 脚本定期清理 MySQL 表空间和磁盘碎片的示例脚本。

这个脚本会查找所有表并执行 OPTIMIZE TABLE 操作。

Shell 脚本

#!/bin/bash

# MySQL 登录信息
MYSQL_USER="mysql_user"
MYSQL_PASSWORD="mysql_password"
MYSQL_HOST="localhost"
MYSQL_DATABASE="database_name"

# 获取所有表名
TABLES=$(mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -h$MYSQL_HOST -D$MYSQL_DATABASE -e "SHOW TABLES;" | awk '{ print $1}' | grep -v '^Tables')

# 对每个表执行 OPTIMIZE TABLE
for TABLE in $TABLES; do
    echo "Optimizing table: $TABLE"
    mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -h$MYSQL_HOST -D$MYSQL_DATABASE -e "OPTIMIZE TABLE $TABLE;"
done

echo "Table optimization complete."

exit 0

总结

定期分析和优化 MySQL 表空间,清理磁盘碎片,从而保持数据库的高效运行。Shell 脚本的自动化处理可以减少手动维护的负担,确保数据库始终处于最佳状态。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • ubuntu下apt-get安装和彻底卸载mysql详解

    ubuntu下apt-get安装和彻底卸载mysql详解

    本文给大家分享ubuntu下apt-get安装和彻底卸载mysql的方法,文中提到了安装mysq命令查看mysql是否运行的命令写法,具体内容详情大家通过本文学习吧
    2017-08-08
  • MySQL隐蔽BUG:组合条件查询无故返回空集的排查与规避方案

    MySQL隐蔽BUG:组合条件查询无故返回空集的排查与规避方案

    在数据库日常运维中,查询结果不符合预期 是高频问题,但多数情况可归因于 SQL 语法、数据异常或索引设计,而本次遇到的案例,却源于 MySQL 的底层 BUG明明数据存在,单一条件查询正常,叠加一个过滤条件后竟返回空集,所以本文为大家介绍了排查与规避方案
    2026-01-01
  • MySQL覆盖索引的使用示例

    MySQL覆盖索引的使用示例

    如果一个索引包含(或覆盖)所有需要查询的字段的值,称为‘覆盖索引’。这篇文章主要给大家介绍了关于MySQL覆盖索引的相关资料,需要的朋友可以参考下
    2021-01-01
  • 一文带你了解如何用MySQL通配符实现过滤功能

    一文带你了解如何用MySQL通配符实现过滤功能

    本文章将介绍什么是通配符、如何使用通配符以及怎样使用LIKE操作符进行通配搜索,以便对数据进行复杂过滤,感兴趣的小伙伴跟着小编一起来学习吧
    2023-07-07
  • MySQL下载时出现starting the server或initializing错误的原因分析及解决

    MySQL下载时出现starting the server或initializing错误的原因分析及

    MySQL安装卡在"StartingServer"或出现"initializing"错误的原因及解决方法,包括检查路径、清理残留文件、调整权限和配置文件等步骤
    2025-12-12
  • MySQL数据库的约束使用实例

    MySQL数据库的约束使用实例

    约束是用来限制表中的数据长什么样子的,即什么样的数据可以插入到表中,什么样的数据插入不到表中,下面这篇文章主要给大家介绍了关于如何通过一文理解MySQL数据库的约束与表的设计的相关资料,需要的朋友可以参考下
    2022-12-12
  • MySQL数据库中使用REPLACE函数示例及实际应用

    MySQL数据库中使用REPLACE函数示例及实际应用

    本文详细介绍了MySQL中的REPLACE函数,包括其基本语法、用法和实际应用场景,REPLACE函数主要用于替换字符串中的某些子字符串,对大小写敏感,文章还通过多个示例展示了REPLACE函数的实际应用,需要的朋友可以参考下
    2024-10-10
  • k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

    k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

    本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实现自动备份,支持X86和ARM架构,并强调cron环境需转义%符号及避免使用-it参数,对k8s mysql、mariadb数据库备份步骤感兴趣的朋友一起看看吧
    2025-06-06
  • MYSQL读写性能测试的简单记录

    MYSQL读写性能测试的简单记录

    本文主要介绍了MYSQL读写性能测试的简单记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • 一文教会你在MySQL中使用DateTime

    一文教会你在MySQL中使用DateTime

    mysql数据库在我们的工作中经常需要使用,经常在表中需要使用时间,下面这篇文章主要给大家介绍了关于在MySQL中使用DateTime的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09

最新评论