首页 > 数据库 >MySQL空间管理:查询、优化与碎片清理

MySQL空间管理:查询、优化与碎片清理

时间:2024-08-26 10:25:01浏览次数:11  
标签:tables MySQL 碎片 MYSQL 空间 TABLE 查询 table 磁盘碎片

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.cnfmy.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 脚本的自动化处理可以减少手动维护的负担,确保数据库始终处于最佳状态。

标签:tables,MySQL,碎片,MYSQL,空间,TABLE,查询,table,磁盘碎片
From: https://blog.csdn.net/promise524/article/details/141537354

相关文章

  • go连接MySQL数据库并查询数据
    前言要在Goland中连接数据库并查询数据,你可以按照以下步骤进行操作:提示:以下是本篇文章正文内容,下面案例可供参考一、导入所需的数据库驱动程序在你的Go代码中使用import语句导入所需的数据库驱动程序。例如,如果你使用的是MySQL数据库,可以使用以下语句导入MySQL驱动程序......
  • Linux环境下的Mysql数据库入门-基于Centos系统
    关系型数据库:oracle===》收钱,大型的公司msyql===》开源的免费的sqlserver===>微软非关系型数据库:hbase===>大数据‘Redismangdb下载mysql:yuminstallmysqlyuminstallmysql-serverrpm-qa|grep-imysql===》查看数据库有没有安装好servicemysqld......
  • 解读GaussDB(for MySQL)表级恢复,看线程数及分块分行策略如何提升恢复性能?
    本文分享自华为云社区《【华为云MySQL技术专栏】GaussDB(forMySQL)表级恢复中mydumper、myloader的应用与性能优化》,作者:GaussDB数据库。 背景介绍表级时间点恢复技术为“误删表”场景提供了一种快速且精确的恢复方案。通过将指定时间点的数据恢复到临时实例,再把用户所需的......
  • 10、Flink动态表之 DataStream 上的关系查询详解
    a)DataStream上的关系查询下表比较了传统的关系代数和流处理与输入数据、执行和输出结果的关系。关系代数/SQL流处理关系(或表)是有界(多)元组集合。流是一个无限元组序列。对批数据(例如关系数据库中的表)执行的查询可以访问完整的输入数据。流式查询在启动时不能访问......
  • mysqldump的使用详解
    一、mysqldump简介mysqldump 是 MySQL 自带的逻辑备份工具。它的备份原理是通过协议连接到 MySQL 数据库,将需要备份的数据查询出来,将查询出的数据转换成对应的insert 语句,当我们需要还原这些数据时,只要执行这些 insert 语句,即可将对应的数据还原。二、备份命令2.1命......
  • 效率神器!一款方便、快捷的数据库文档查询、导出工具!
    大家好,我是Java陈序员。之前给大家推荐过一款简洁好用的数据库表结构文档生成器。永不生锈的螺丝钉!一款简洁好用的数据库表结构文档生成器今天,再给大家介绍一款开源的数据库操作工具,功能更加强大!支持文档导出、SQL查询、代码生成...以及十几种实用的工具!关注微信公众号:【Jav......
  • MySQL高可用架构之MHA
    简介:MHA(Master HighAvailability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障......
  • MySQL索引类型
    一、简介MySQL目前主要有以下几种索引类型:1.普通索引2.唯一索引3.主键索引4.组合索引5.全文索引二、语句CREATETABLEtable_name[col_namedatatype][unique|fulltext][index|key][index_name](col_name[length])[asc|desc]1.unique|fulltext为可选参数,分别表示唯一索引......
  • MySQL 创建数据库用户并授权
    登录MySQL服务器:首先,你需要以具有足够权限的用户(通常是root用户)登录到MySQL服务器。mysql-uroot-p创建新用户:使用CREATEUSER语句创建新用户,并设置密码。CREATEUSER'newuser'@'localhost'IDENTIFIEDBY'password';这里newuser是新用户的用户名,password是......
  • mysql查看binlog日志
      业内目前推荐使用的是row模式,准确性高,虽然说文件大,但是现在有SSD和万兆光纤网络,这些磁盘IO和网络IO都是可以接受的。 那么,大家一定想问,为什么不推荐使用mixed模式,理由如下假设master有两条记录,而slave只有一条记录。master的数据为+----+------------------------------......