本文整理自网络,侵删。
目录
在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数据库】第四章解读:schema与数据类型优化(下)
为何要将ubuntu 16.04 设置 mysql 的编码为 utf8?
更多相关阅读请进入《mysql》频道 >>

数据库系统概念 第6版
机械工业出版社
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。
转载请注明出处:木庄网络博客 » MYSQL优化之数据表碎片整理详解
相关推荐
评论
管理员已关闭评论功能...