背景信息
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) 更新包含可变长字段的数据也会导致表空间碎片率增高,那么在表设计的时候如果可以的话,尽量使用较小的数据类型并且选择定长的数据类型。
参考文献:
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论