MySQL碎片整理

MySQL碎片

MySQL 碎片就是 MySQL 数据文件中一些不连续的空白空间,这些空间无法再被全部利用,久而久之越来多,越来越零碎,从而造成物理存储和逻辑存储的位置顺序不一致,这就是碎片。

碎片的产生

  • delete 操作

MySQL 中删除数据,在存储中就会产生空白的空间,当有新数据插入时,MySQL 会试着在这些空白空间中保存新数据,但是呢总是用不满这些空白空间。所以日积月累,亦或是一下有大量的 delete 操作,一下就会有大量的空白空间,慢慢的会大到比表的数据使用的空间还大。

  • update 操作

MySQL 中更新数据,在可变长度的字段(比如 varchar)中更新数据,innodb 表存储数据的单位是页,update 操作会造成页分裂,分裂以后存储变的不连续,不规则,从而产生碎片。比如说原始字段长度 varchar(100),我们大量的更新数据长度位为 50,这样的话,有 50 的空间被空白了,新入库的数据不能完全利用剩余的 50,这就会产生碎片。

碎片的影响

  • 空间浪费

空间浪费不用多说,碎片占用了大量可用空间。

  • 读写性能下降

由于存在大量碎片,数据从连续规则的存储方式变为随机分散的存储方式,磁盘 IO 会变的繁忙,数据库读写性能就会下降。

查看碎片

-- 通过表状态信息查看
show table status like '%table_name%';

MySQL碎片整理_第1张图片
Data_Length 表数据大小
Index_Length 表索引大小
Data_Free 碎片大小

-- 通过数据库视图信息查看
select t.table_schema,
       t.table_name,
       t.table_rows,
       t.data_length,
       t.index_length,
       concat(round(t.data_free / 1024 / 1024, 2),
              'm') as data_free
from information_schema.tables t
where t.table_name = 'table_name';

data_free 列数据就是我们要查询的表的碎片大小内容

清理碎片

-- 整理数据文件,重新排列索引
optimize table table_name;

OPTIMIZE TABLE适用于 InnoDBMyISAMARCHIVE。OPTIMIZE TABLE也支持内存中NDB表的动态列。它不适用于内存中表的固定宽度列,也不适用于磁盘数据表。

对于 InnoDB 表,OPTIMIZE TABLE 等于 ALTER TABLE ... FORCE,用于重建表以更新索引统计信息并释放聚集索引中未使用的空间。

OPTIMIZE TABLE会锁表,时间长短依据表数据量的大小。

MySQL 8.0 参考手册

-- 重建表的存储引擎,重组数据和索引的存储。
alter table table_name engine = innodb;

MySQL 8.0 参考手册-对表进行碎片整理

根据实际情况,只需要每周或者每月整理一次即可

你可能感兴趣的:(数据库,mysql,数据库,sql,索引)