赞
踩
在测试环境清空了某一个数据量较大的MySQL 表,但发现,其仍占据着存储空间。
心生疑问,故搜索了一番,在此简单做个整理。
举个例子,假设一条记录二十个字节。
将两万条记录删到只剩一行,列表中有用的内容将只占二十字节。
如果没有及时插入,MySQL在 读取时会仍然将其视同于一个容量为四十万字节的列表进行处理,但实际上除了这二十字节以外,其它空间都被白白浪费了。
当MySQL 对数据进行扫描时,它扫描的对象实际是表的容量需求上限,也就是表的数据实际占用空间 + 空白空间。
定期进行表空间整理,消除碎片可以
举个例子,一个公司有10 个员工,10 个座位,被开除了7 个员工,但这些座位还是保留的。
碎片整理就像,让剩下的3个员工都靠边坐,然后把剩下的7 个座位给砸掉,这样就能释放出空间了。
使用下面的命令检查数据库各数据表的空间使用情况:
show table status from db_name
查询结果如下:
其中Date_free 代表的就是空白空间,即碎片。当Date_free 大于0 时就表示对于的数据表存在碎片。
使用下面的命令进行碎片的清理:
optimize table 表名
独立表空间:就是采用和MyISAM 相同的方式,每个表拥有一个独立的数据文件( .idb )。
- 每个表都有自已独立的表空间。
- 每个表的数据和索引都会存在自已的表空间中。
- 可以实现单表在不同的数据库中移动(将一个库的表移动到另一个库里,可以正常使用)。
- drop table 自动回收表空间,删除大量数据后可以通过alter table XX engine = innodb; 回收空间
optimize table 的操作,在MySQL5.5 和5.6 中,实际上执行的过程是,首先创建一张新的临时表,把旧表锁住,禁止插入删除只允许读写,接着把数据不断从旧表拷贝到新临时表,拷贝完成后,进行瞬间rename 操作,再删除旧表。
使用下面的命令进行碎片的清理:
ALTER TABLE table_name ENGINE= INNODB
其实对于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 这种方法的。
选择具体的数据表,鼠标右击后选择【维护 -> 优化表】即可,其效果与OPTIMIZE TABLE 大抵相同。
好了,本文到此结束。
我是陈冰安,Java 工程师,时不时也会整一整Linux 。
欢迎关注我的公众号【暗星涌动】,愿与你一同进步。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。