Hexo

点滴积累 豁达处之

0%

Mysql 碎片

MySQL 清除表空间碎片

1 碎片产生的原因

  • 表的存储会出现碎片化,每当删除了一行内容,该段空间就会变为空白、被留空,而在一段时间内的大量删除操作,会使这种留空的空间变得比存储列表内容所使用的空间更大;
  • 当执行插入操作时,MySQL会尝试使用空白空间,但如果某个空白空间一直没有被大小合适的数据占用,仍然无法将其彻底占用,就形成了碎片;
  • 当MySQL对数据进行扫描时,它扫描的对象实际是列表的容量需求上限,也就是数据被写入的区域中处于峰值位置的部分;

2 碎片查询

查询某数据库的所有表空间:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
select 
CONCAT(TABLE_SCHEMA,'.',TABLE_NAME) as table_name,
table_rows,
concat(truncate((DATA_LENGTH+DATA_FREE+INDEX_LENGTH)/1024/1024,2),' MB') as total_size,
concat(truncate(DATA_LENGTH/1024/1024,2),' MB') as data_size,
concat(truncate(DATA_FREE/1024/1024,2),' MB') as data_free,
concat(truncate(INDEX_LENGTH/1024/1024,2),'MB') as index_size
from information_schema.tables where TABLE_SCHEMA='数据库名';

# table_name 表名
# table_rows 表行数
# total_size 表总空间大小
# data_size 数据占用空间大小
# data_free 碎片空间大小
# index_size 索引空间大小

查询某表的所有空间占用情况:

1
select table_name,engine,table_rows,data_length+index_length length,DATA_FREE/1024/1024 as data_free from information_schema.tables where table_name='表名';

3 碎片清理

myisam存储引擎回收碎片

1
optimize table 表名1,表名2,表名3,表名4;

innodb存储引擎回收碎片

1
alter table 表名 engine=innodb;

参考链接

参考链接