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


Posted in MySQL onApril 03, 2022

在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;

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

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

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

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

demo.MYD文件约为50MB

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

DELETE FROM DEMO WHERE id < 3

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

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

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

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

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

删除数据后,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表进行碎片整理。

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

对demo表进行碎片整理

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

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

碎片整理后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 CHAR和VARCHAR该如何选择
May 31 MySQL
MySQL 常见存储引擎的优劣
Jun 02 MySQL
MySQL中in和exists区别详解
Jun 03 MySQL
MySQL索引失效的典型案例
Jun 05 MySQL
MySQL 常见的数据表设计误区汇总
Jun 07 MySQL
解决mysql模糊查询索引失效问题的几种方法
Jun 18 MySQL
MySQL 聚合函数排序
Jul 16 MySQL
MySQL实例精讲单行函数以及字符数学日期流程控制
Oct 15 MySQL
MySQL七大JOIN的具体使用
Feb 28 MySQL
Mysql超详细讲解死锁问题的理解
Apr 01 MySQL
MySQL运行报错:“Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre”解决方法
Jun 14 MySQL
MySQL实现用逗号进行拼接、以逗号进行分割
Dec 24 MySQL
Innodb存储引擎中的后台线程详解
Apr 03 #MySQL
MySQL磁盘碎片整理实例演示
Mysql使用全文索引(FullText index)的实例代码
Apr 03 #MySQL
一文简单了解MySQL前缀索引
为什么MySQL不建议使用SELECT *
详解MySQL的主键查询为什么这么快
MySQL表锁、行锁、排它锁及共享锁的使用详解
You might like
提高PHP编程效率的53个要点(经验小结)
2010/09/04 PHP
PHP学习之数组的定义和填充
2011/04/17 PHP
PHP 输出URL的快捷方式示例代码
2013/09/22 PHP
PHP引用(&amp;)各种使用方法实例详解
2014/03/20 PHP
ThinkPHP CURD方法之field方法详解
2014/06/18 PHP
laravel安装zend opcache加速器教程
2015/03/02 PHP
PHP获取文件行数的方法
2015/06/10 PHP
PHP使用fopen与file_get_contents读取文件实例分享
2016/03/04 PHP
php常用正则函数实例小结
2016/12/29 PHP
Laravel中encrypt和decrypt的实现方法
2017/09/24 PHP
PHP实现Huffman编码/解码的示例代码
2018/04/20 PHP
thinkPHP5框架auth权限控制类与用法示例
2018/06/12 PHP
window.open()弹出居中的窗口
2007/02/01 Javascript
javascript动画对象支持加速、减速、缓入、缓出的实现代码
2012/09/30 Javascript
jQuery实现随意改变div任意属性的名称和值(部分原生js实现)
2013/05/28 Javascript
jquery操作HTML5 的data-*的用法实例分享
2014/08/17 Javascript
jQuery实现手机号码输入提示功能实例
2015/04/30 Javascript
jQuery与getJson结合的用法实例
2015/08/07 Javascript
Javascript 实现放大镜效果实例详解
2016/12/03 Javascript
微信小程序 列表的上拉加载和下拉刷新的实现
2017/04/01 Javascript
vue 自定指令生成uuid滚动监听达到tab表格吸顶效果的代码
2020/09/16 Javascript
python实现定制交互式命令行的方法
2014/07/03 Python
Python实现将HTML转换成doc格式文件的方法示例
2017/11/20 Python
linecache模块加载和缓存文件内容详解
2018/01/11 Python
python自动登录12306并自动点击验证码完成登录的实现源代码
2018/04/25 Python
TensorFlow Session使用的两种方法小结
2018/07/30 Python
python将一组数分成每3个一组的实例
2018/11/14 Python
python+selenium+chromedriver实现爬虫示例代码
2020/04/10 Python
美国眼镜网站:EyeBuyDirect
2017/04/13 全球购物
Ryderwear澳洲官网:澳大利亚高端健身训练装备品牌
2018/09/18 全球购物
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
2014/07/27 面试题
班主任与学生安全责任书
2014/07/25 职场文书
学生检讨书如何写
2014/10/30 职场文书
校运会新闻稿
2015/07/17 职场文书
《卧薪尝胆》读后感3篇
2019/12/26 职场文书
学习nginx基础知识
2021/09/04 Servers