优化:数据碎片

一:数据碎片化原因

Mysql引擎不同,碎片化的原因也有所差别。

在InnoDB中,了,因而空间也没有真的被释放回收。

1:删除一些行,这些行只是被标记为“已删除”,而不是真的从索引中物理删除,所以就没能释放回收。InnoDB的 Purge线程会异步的来清理这些没用的索引键和行。但是依然没有把这些释放出来的空间还给操作系统重新使用,因而会导致页面中存在很多空洞。如果表结构中包含动态长度字段,那么这些空洞甚至可能不能被InnoDB重新用来存新的行,因为空间空间长度不足

2:大量的随机 delete 操作,在数据文件中造成不连续的空白空间。而当插入数据时,这些空白空间则会利用起来,于是造成了数据的存储位置不连续。物理存储顺序与逻辑上的排序顺序不同,这种就是数据碎片

3:对于大量的UPDATE,也会产生文件碎片化 , Innodb的最小物理存储分配单位是页(page),而UPDATE也可能导致页分裂(page split),频繁的页分裂,页会变得稀疏,并且被不规则的填充,所以最终数据会有碎片

二:数据碎片化类型

1:行碎片(Row fragmentation)

指的是数据行被存储为多个地方的多个片段。即使查询只从索引中访问一行记录。行碎片也会导致性能下降。

2:行间碎片(Intra-row fragmentaion)

行间碎片是指逻辑上顺序的页,或者行在磁盘上不是顺序存储的。行间碎片对诸如全表扫描和聚簇索引扫描之类的操作有很大的影响,因为这些操作原本能够从磁盘上顺序存储的数据中获益。

3:剩余空间碎片(Free space fragmentation)

剩余空间碎片是指数据页中有大量的空余空间。这会导致服务器读取大量不需要的数据。从而造成浪费。

对于MyISAM表,这三类碎片化都有可能发生。但InnoDB不会出现短小的行碎片;InnoDB会移动短小的行并写到一个片段中。InnoDb会移动短小的行并重写到一个片段中

三:发现数据碎片化严重的表

1:方法

1.1:使用show table status from xxxx like 'xxxx' \G;

第一个xxx:表所在的数据库名称,第二个xxx:要查询的表名。这个方法有局限性,只能单表查询碎片化情况,不能查询某个数据库或整个实例下所有表的碎片 

1.2:查询information_schema.TABLES获取表的碎片化信息

2:主要参数

data_length:数据长度;

index_length:索引长度;

free_data:所以这里是空闲空间或碎片大小;

用pt-online-schema-change工具也能进行在线整理表结构,收集碎片等操作

四:处理方案

1:OPTIMIZE TABLE

它会重组表和索引的物理存储,减少对存储空间使用和提升访问表时的IO效率,OPTIMIZE 操作会暂时锁住表,而且数据量越大,耗费的时间也越长。OPTIMIZE TABLE后,表的变化跟存储引擎有关

MyISAM

PTIMIZE TABLE 的工作原理如下:

      如果表有已删除的行或拆分行(split rows),修复该表。

如果未对索引页面进行排序,对它们进行排序。

  如果表的统计信息不是最新的(并且无法通过对索引进行排序来完成修复),更新它们。

InnoDB

由OPTIMIZE TABLE触发表的重建,并在ALTER TABLE ... FORCE的掩护下完成。仅在操作的准备阶段和提交阶段期间短暂地进行独占表锁定。在准备阶段,更新元数据并创建中间表。在提交阶段,将提交表元数据更改。

OPTIMIZE TABLE 在以下条件下使用表复制方法重建表:

 启用old_alter_table系统变量时

启用mysqld --skip-new 选项时

OPTIMIZE TABLE 对于包含FULLTEXT索引的InnoDB表不支持online DDL。而是使用复制表的方法。

InnoDB使用页面分配方法存储数据,并且不会像传统存储引擎(例如MyISAM)那样受到碎片的影响。在考虑是否运行优化时,请考虑服务器将处理的事务的工作负载:

 预计会有一定程度的碎片化。 InnoDB仅填充93%的页面,为更新留出空间而无需拆分页面。

  删除操作可能会留下空白,使页面填充不如预期,这可能使得优化表格变得有价值。

2:ALTER TABLE table_name ENGINE = Innodb;

这其实是一个NULL操作,表面上看什么也不做,实际上重新整理碎片了.当执行优化操作时,实际执行的是一个空的 ALTER 命令,但是这个命令也会起到优化的作用,它会重建整个表,删掉未使用的空白空间

3:用pt-online-schema-change工具也能进行在线整理表结构,收集碎片等操作

比较

对于InnoDB引擎,ALTER TABLE xxxx ENGINE= INNODB是执行了一个空的ALTER TABLE操作。而OPTIMIZE TABLE等价于ALTER TABLE ... FORCE。 参考上面描述,在有些情况下,OPTIMIZE TABLE 还是ALTER TABLE xxxx ENGINE= INNODB基本上是一样的。但是在有些情况下,ALTER TABLE xxxx ENGINE= INNODB更好。例如old_alter_table系统变量没有启用等等。另外对于MyISAM类型表,使用ALTER TABLE xxxx ENGINE= INNODB是明显要优于OPTIMIZE TABLE这种方法的。

发布了50 篇原创文章 · 获赞 2 · 访问量 2279

猜你喜欢

转载自blog.csdn.net/eafun_888/article/details/104738675
今日推荐