Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql表空间碎片率过高清理

mysql表空间碎片率过高怎么清理?这三种方法最有效

作者:时间会告诉你答案,但不能重来

还在为mysql表空间碎片率高而烦恼吗?本文详细解释碎片产生的原因和影响,并分享三种实用的空间回收方法,包括optimize table、alter table force和mysqldump重建,帮你提升数据库性能,降低IO成本

背景信息

MySQL 版本: MySQL 5.7.20

碎片产的生原因

(1)记录被Delete,且原空间无法复用(MySQL插入为了提高效率直接插入末尾的);

(2)记录被Update(通常出现在变长字段中,重新分配存储空间),原空间无法复用;

(3)记录插入导致页分.裂,页的填充率降低;

碎片率高的影响

(1)浪费磁盘空间;

(2)可能导致查询扫描的IO成本提升,效率降低;

如果表空间较小或者碎片率较小,用户无需关注,也不建议执行回收空间碎片操作。

回收表空间碎片的三种方法

方法一

optimize table table_name

OPTIMEZE TABLE 重新组织 table 数据和相关索引数据的物理存储,以减少访问table的存储空间并提高I/O效率。对每个 table 所做的确切更改取决于该 table 使用的存储引擎。

回收碎片的常见放大是通过optimize table tablename 来重组文件,操作过程会导致该表上的写操作无法执行(锁表),实例负载增大,请用户谨慎操作,如果确定需要回收,建议放在业务低峰期进行。

方法二

alter table table_name engine=INNODB

定期执行”null” ALTER TABLE 操作,会导致MySQL重建table:

ALTER TABLE tbl_name ENGINE=INNODB

还可以使用ALTER TABLE tbl_name FORCE执行重建table的”null”更改操作。

ALTER TABLE tbl_name ENGIN=INNODB和ALTER TABLE tbl_name FORCE都使用在线 DDL。

方法三

mysqldumptable、删除table、重新载入数据

执行碎片整理操作的另一种方法是使用mysqldump将table转储到文本文件,删除table,然后从转存文件重新加载它。

拓展

(1) 频繁的 delete 操作导致表空间碎片率增高是不可避免的;

(2) 更新包含可变长字段的数据也会导致表空间碎片率增高,那么在表设计的时候如果可以的话,尽量使用较小的数据类型并且选择定长的数据类型。

参考文献:

总结

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

您可能感兴趣的文章:
阅读全文