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 正确清理binlog 删除数据后磁盘空间的
(3条消息)MySQL删除数据后磁盘空间的释放情况 - ZERO - CSDN博客 https://blog.csdn.net/zero__007/article/details/51404091 m ...
- mysql定时清理binlog
一.没有主从同步的情况下清理日志 mysql -uroot -p123456 -e 'PURGE MASTER LOGS BEFORE DATE_SUB( NOW( ),INTERVAL 5 DAY) ...
- MySQL表碎片清理
MySQL大表清理 生产环境data库业务表base_data大小:500G,data_free:31G mysql> SELECT table_schema,table_name,data_f ...
- 【转】利用optimize、存储过程和系统表对mysql数据库表进行批量碎片清理释放表空间
本文收集于本人的笔记本,由于找不到原文出处.在此省略,如哪位知道可以联系我加上. 核心是利用mysql系统表和“optimize table 表名”命令,对mysql数据表进行空间的释放.由于dele ...
- MysqL碎片整理优化
先来说一下什么是碎片,怎么知道碎片有多大! 简单的说,删除数据必然会在数据文件中造成不连续的空白空间,而当插入数据时,这些空白空间则会被利用起来.于是造成了数据的存储位置不连续,以及物理存储顺序与理论 ...
- MySql 碎片
查看某个表所占空间,以及碎片大小. select table_name,engine,table_rows,data_length+index_length length,DATA_FREE from ...
- MySQL碎片整理小节--实例演示
MYSQL之磁盘碎片整理 清澈,细流涓涓的爱 数据库引擎以InnoDB为主 1.磁盘碎片是什么 InnoDB表的数据存储在页中,每个页可以存放多条记录,这些记录以树形结构组织,这棵树称为B+树. ...
- mysql日志清理
mysql bin-log 日志清理 发现mysql数据库目录中bin-log中日志文件非常大 [root@localhost var]# du -sh mysql-bin* | sort 1020K ...
- 彻底删除mysql服务(清理注册表)
由于安装某个项目的执行文件,提示要卸载MySQL以便它自身MySQL安装,然后我禁用了MYSQL服务,再把这个文件夹删除后,发现还是提示请卸载MYSQL服务. 解决步骤: 1.以管理员身份运行命令提示 ...
随机推荐
- 如何在本地用vs调试微信接口
这段时间在研究微信,看了网上很多都是把项目发布之后在服务器上调试,可以我想可以直接在vs上面设置断点调试 刚开始才用 http://www.cnblogs.com/hanzhaoxin/p/45186 ...
- MyBatis 模糊查询 防止Sql注入
#{xxx},使用的是PreparedStatement,会有类型转换,所以比较安全: ${xxx},使用字符串拼接,可以SQL注入: like查询不小心会有漏洞,正确写法如下: Mysql: ...
- python--tesseract
tesseract的介绍 我们爬虫会受到阻碍,其中一个便是我们在模拟登陆或者请求一些数据的时候,出现的图形验证码,因此我们需要一种能叫图形验证码识别成文本的技术.将图片翻译成文字一般称为光学文字识别( ...
- Redis -- 过期时间 和 缓存 例子
1.设置 key的生存时间,过期自动删除 exprire key seconds 设置过期时间 秒数 ttl key 查询剩余时间 如果 设置了过期时间.对key进行 set 操作,会清除 ...
- JS将日期转换为yyyy-MM-dd HH:mm:ss
//格式化后日期为:yyyy-MM-dd HH:mm:ss function FormatAllDate(sDate) { var date = new Date(sDate); var sepera ...
- [知识复习] C语言文件读写
文件打开 fopen() 返回FILE* 对象,如果打开失败返回NULL,错误代码存入errno中 FILE *fopen( const char * filename, const char * m ...
- 急!急!急!请问win32api参数乱码如何解决!
我想做一个QQ自动登陆,使用的QQ是2009.现在先模拟打开QQ,然后通过api调用回调函数.回调函数为一个委托方法,但是在方法中整个参数乱码,请问如何解决? 具体流程为,启动QQ,获取当前启动QQ的 ...
- 递归遍历JSON树
递归遍历JSON树 前几天有个人问我,json串的层级无限深,但在json串中的key是已知的,在json串中的value,有些事Object,有些是Array,如何把这些层级无限深的key所对应的v ...
- javascript大神修炼记(5)——OOP思想(封装)
读者朋友们好,前面我们已经讲解了有关javascript的基础,从今天的内容开始,我们就要开始讲有关封装的内容了,这里,我们就一点一点地接触到OOP(面向对象编程)了,如果作为一门语言使用的程序员连O ...
- OpenStack 计算服务 Nova介绍和控制节点部署 (八)
一)nova在keystone上服务注册 1.1创建nova务实体 [root@controller ~]# source admin-openrc [root@controller ~]# open ...