【昊鼎王五】mysql 表文件,表空间压缩

本文详细介绍如何通过查询和优化命令来压缩MySQL表空间,减少磁盘占用。首先,使用SQL查询检查表空间大小和使用情况,然后执行优化命令来压缩表。文章还提供了查询表空间详细信息的命令。

【昊鼎王五】mysql 表文件,表空间压缩

前言:

我的mySQL使用一段时间后,表空间已变得很大(软件有较多的删除增加操作),现在我想把占用的磁盘空间减少,请教如何操作?

先查询

SELECT  
TABLE_NAME, (DATA_LENGTH+INDEX_LENGTH)/1048576 AS size_Mb, TABLE_ROWS FROM information_schema.tables 
WHERE 
TABLE_SCHEMA='$db-name' 
AND 
TABLE_NAME='$table-name';

再执行压缩优化:

>user database;

>OPTIMIZE   table   tb_name;

查询扩展:

查询 表空间占用情况 命令:

select concat(truncate(sum(data_length)/1024/1024,2),'MB') as data_size,
concat(truncate(sum(max_data_length)/1024/1024,2),'MB') as max_data_size,
concat(truncate(sum(data_free)/1024/1024,2),'MB') as data_free,
concat(truncate(sum(index_length)/1024/1024,2),'MB') as index_size
from information_schema.tables where TABLE_NAME = 't_tb_item';

好了,聪明如你,就讲到这里吧,有问题的话可以留言。
在这里插入图片描述

MySQL 数据库中,可以通过连接(JOIN)操作将多个关联起来,再利用 `GROUP BY` 对字段进行分组,并结合聚合函数 `COUNT(*)` 统计每组的记录数量。这种操作在实际应用中非常常见,例如统计每个部门的员工数量、每个班级的学生人数等。 ### 连接与分组统计的基本语法 以下是一个典型的 SQL 查询语句,展示如何通过 `JOIN` 连接两个,并按某个字段分组后统计每组记录数量: ```sql SELECT t1.group_field, COUNT(*) AS total_count FROM table1 t1 JOIN table2 t2 ON t1.id = t2.foreign_key_id GROUP BY t1.group_field; ``` - `table1` 和 `table2` 是需要连接的两个。 - `t1.id = t2.foreign_key_id` 是两个之间的关联条件。 - `t1.group_field` 是用于分组的字段。 - `COUNT(*)` 统计每组的记录数量。 ### 示例 假设存在两个:`department`(部门)和 `employee`(员工),其中 `employee` 中包含外键 `department_id` 关联到 `department` 的主键 `id`。 #### 创建并插入数据 ```sql CREATE TABLE department ( id INT PRIMARY KEY, name VARCHAR(50) ); CREATE TABLE employee ( id INT PRIMARY KEY, name VARCHAR(50), department_id INT ); INSERT INTO department VALUES (1, '研发部'), (2, '销售部'), (3, '市场部'); INSERT INTO employee VALUES (1, '张三', 1), (2, '李四', 1), (3, '王五', 2), (4, '赵六', 2), (5, '钱七', 3), (6, '孙八', NULL); ``` #### 查询每个部门的员工数量 ```sql SELECT d.name AS department_name, COUNT(e.id) AS employee_count FROM department d LEFT JOIN employee e ON d.id = e.department_id GROUP BY d.id; ``` 该查询使用 `LEFT JOIN` 确保即使某个部门没有员工,也会显示为 0。结果如下: ``` department_name | employee_count ----------------|--------------- 研发部 | 2 销售部 | 2 市场部 | 1 ``` 如果 `employee` 中存在 `department_id` 为 `NULL` 的记录,则这些记录将不会被分组到任何部门中。若希望统计这些未分配部门的员工数量,可以将 `GROUP BY` 改为: ```sql SELECT IFNULL(d.name, '未分配') AS department_name, COUNT(e.id) AS employee_count FROM department d RIGHT JOIN employee e ON d.id = e.department_id GROUP BY d.id; ``` 这样可以将 `NULL` 值归为“未分配”部门进行统计。 ### 处理 NULL 值的分组情况 根据引用内容,MySQL 在分组时,如果 `GROUP BY` 字段包含 `NULL` 值,所有 `NULL` 值会被归为一组[^3]。例如,若 `employee` 中 `department_id` 存在多个 `NULL` 值,则这些记录会被视为一个独立的组。 ### 多连接与分组统计 在实际业务中,可能需要连接多个进行分组统计。例如,统计每个班级的学生人数,并显示班主任姓名: ```sql SELECT c.class_name, t.teacher_name, COUNT(s.id) AS student_count FROM class c JOIN teacher t ON c.teacher_id = t.id JOIN student s ON c.id = s.class_id GROUP BY c.id; ``` 此查询连接了 `class`(班级)、`teacher`(教师)和 `student`(学生),并按班级分组统计学生数量,同时显示对应的班主任姓名。 ### 使用 GROUP_CONCAT 合并字段值 如果希望在分组统计的同时,将某一字段的多个值合并为一个字符串,可以使用 `GROUP_CONCAT` 函数。例如,统计每个班级的学生姓名: ```sql SELECT class, GROUP_CONCAT(name) AS students FROM student GROUP BY class; ``` 该查询将每个班级的学生姓名合并为一个字符串输出[^2]。 ### 总结 通过 `JOIN` 连接多个后,结合 `GROUP BY` 和聚合函数(如 `COUNT`、`GROUP_CONCAT`)可以实现丰富的统计功能。这种操作不仅能够统计每组记录数量,还可以合并字段值、处理 `NULL` 值等,适用于各种业务场景。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值