MYSQL优化之数据表碎片整理详解

 更新时间:2022年04月02日 10:54:38   作者:刘俊涛的博客  
在日常的数据库维护中,在给客户制定维护方案时,都会有降低高水位此类的建议 建议每年年终定期做数据整理,下面这篇文章主要给大家介绍了关于MYSQL优化之数据表碎片整理的相关资料,需要的朋友可以参考下

在MySQL中,我们经常会使用VARCHAR、TEXT、BLOB等可变长度的文本数据类型。不过,当我们使用这些数据类型之后,我们就不得不做一些额外的工作——MySQL数据表碎片整理。

那么,为什么在使用这些数据类型之后,我们就要对MySQL定期进行碎片整理呢?

现在,我们先来看一个具体的例子。在这里,我们使用如下SQL语句在MySQL自带的TEST数据库中创建名为DEMO的数据表并插入5条测试数据。

--创建DEMO表
CREATE TABLE DEMO(
id int	unsigned,
body text
) engine=myisam charset=utf8;
												
 
--插入5条测试数据
INSERT INTO DEMO VALUES(1,'AAAAA');
INSERT INTO DEMO VALUES(2,'BBBBB');
INSERT INTO DEMO VALUES(3,'CCCCC');
INSERT INTO DEMO VALUES(4,'DDDDD');
INSERT INTO DEMO VALUES(5,'EEEEE');

然后我们以这5条测试数据为基础,使用如下INSERT INTO语句重复执行多次进行复制性插入。

INSERT INTO DEMO SELECT id, body FROM DEMO;

使用INSERT INTO语句多次插入产生总共约262万条数据

众所周知,MySQL中MyISAM表的数据是以文件形式存储的,我们可以在MySQL存储数据的文件夹中找到数据库test目录下的demo.MYD文件。此时,我们可以看到demo.MYD文件的大小约为50MB。

demo.MYD文件约为50MB

此时,假如我们需要删除DEMO表中所有ID列小于3的数据(即1和2),于是我们执行如下SQL语句:

DELETE FROM DEMO WHERE id < 3

此时,我们可以看到DEMO表中的数据量只有原来的3/5:

删除后,只剩下157万条记录

DEMO表中的现有数据量只有原来的3/5,按理说,这个时候demo.MYD文件的大小也应该只有原来的3/5左右。不过,我们再次查看demo.MYD文件时,却惊奇地发现该文件的大小一点都没有变!

删除数据后,demo.MYD的文件大小没有变化

那么就究竟是怎么一回事呢?原来,在MySQL中,如果我们删除了表中的大量数据,或者我们对含有可变长度文本数据类型(VARCHAR,TEXT或BLOB)的表进行了很多更改,不过被删除的数据记录仍然被保持在MySQL的链接清单中,因此数据存储文件的大小并不会随着数据的删除而减小。

当我们确定数据需要被清除掉时,那么这些数据就已经成了无用的数据,但是按照MySQL的处理方式,这些数据仍然会占用我们的磁盘空间,从而造成了极大的资源浪费。不仅如此,过大的数据文件还会导致MySQL执行相关数据操作时需要耗费更多的性能和时间。因此,对MySQL的某些数据表进行碎片整理是非常有必要的。

对MySQL进行碎片整理的方法非常简单,因为MySQL已经给我们提供了对应的SQL指令,这个SQL指令就是OPTIMIZE TABLE,其完整语法如下:

OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE table_name1 [, table_name2] ...

从上面的语法描述中,我们可以得知,OPTIMIZE TABLE可以一次性对多个表进行碎片整理,只需要在OPTIMIZE TABLE后面接多个表名,并以英文逗号隔开即可。

此外,OPTIMIZE TABLE语句有两个可选的关键字:LOCAL和NO_WRITE_TO_BINLOG。在默认情况下,OPTIMIZE TABLE语句将会被记录到二进制日志中,如果我们指定了LOCAL或NO_WRITE_TO_BINLOG关键字,则不会记录。当然,一般情况下,我们也无需关注这两个关键字。

现在,我们就使用OPTIMIZE TABLE语句对刚才的DEMO表进行碎片整理。

对demo表进行碎片整理

然后,我们再来查看demo.MYD文件,此时我们就会发现demo.MYD文件的大小已经减小到约为原来的3/5了。

碎片整理后demo.MYD文件的大小

备注:

1.MySQL官方建议不要经常(每小时或每天)进行碎片整理,一般根据实际情况,只需要每周或者每月整理一次即可。

2.OPTIMIZE TABLE只对MyISAM,BDB和InnoDB表起作用,尤其是MyISAM表的作用最为明显。此外,并不是所有表都需要进行碎片整理,一般只需要对包含上述可变长度的文本数据类型的表进行整理即可。

3.在OPTIMIZE TABLE运行过程中,MySQL会锁定表。

4.默认情况下,直接对InnoDB引擎的数据表使用OPTIMIZE TABLE,可能会显示「 Table does not support optimize, doing recreate + analyze instead」的提示信息。这个时候,我们可以用mysqld --skip-new或者mysqld --safe-mode命令来重启MySQL,以便于让其他引擎支持OPTIMIZE TABLE。

总结

到此这篇关于MYSQL优化之数据表碎片整理的文章就介绍到这了,更多相关MYSQL数据表碎片整理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解MySQL主从不一致情形与解决方法

    详解MySQL主从不一致情形与解决方法

    这篇文章主要介绍了详解MySQL主从不一致情形与解决方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-04-04
  • MySQL中的ALTER EVENT语句的具体使用

    MySQL中的ALTER EVENT语句的具体使用

    EVENT 是一种特殊的数据库对象,它允许你在指定的时间间隔或特定的时间自动执行SQL语句或语句集,本文主要介绍了MySQL中的ALTER EVENT语句的具体使用,感兴趣的可以了解一下
    2024-07-07
  • MySQL数据库表约束讲解

    MySQL数据库表约束讲解

    这篇文章主要介绍了MySQL数据库表约束讲解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • MySql索引原理与操作

    MySql索引原理与操作

    索引是有双面性的,合理的建立索引可以提高数据库的效率。但是如果没有合理的构建索引和使用索引,可能会导致索引失效或者影响数据库性能,这篇文章主要介绍了MySql索引原理与操作
    2022-09-09
  • MYSQL的binary解决mysql数据大小写敏感问题的方法

    MYSQL的binary解决mysql数据大小写敏感问题的方法

    BINARY不是函数,是类型转换运算符,它用来强制它后面的字符串为一个二进制字符串,可以理解为在字符串比较的时候区分大小写
    2013-09-09
  • MySQL——修改root密码的4种方法(以windows为例)

    MySQL——修改root密码的4种方法(以windows为例)

    本文以windows为例为大家详细介绍下MySQL修改root密码的4种方法,大家可以可以根据的自己的情况自由选择,希望对大家有所帮助
    2013-07-07
  • 关于对mysql语句进行监控的方法详解

    关于对mysql语句进行监控的方法详解

    这篇文章主要给大家介绍了关于对mysql语句进行监控的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用mysql具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07
  • Mysql 存储过程中使用游标循环读取临时表

    Mysql 存储过程中使用游标循环读取临时表

    这篇文章主要介绍了Mysql 存储过程中使用游标循环读取临时表的方法,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下
    2020-12-12
  • MySQL分表和分区的具体实现方法

    MySQL分表和分区的具体实现方法

    这篇文章主要介绍了MySQL分表和分区的具体实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-06-06
  • Mysql中having与where的区别小结

    Mysql中having与where的区别小结

    本文主要介绍了MySQL中WHERE和HAVING子句的区别,包括它们的执行顺序、效率、适用条件和在多表关联查询中的应用,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03

最新评论