mlxahcf 发表于 2012-03-08 09:28

查看innodb表碎片及清理

现在我有一台mysql数据库,请高手指教如何查看innodb表的碎片以及如何清理,谢谢

shanchao7932297 发表于 2012-03-08 10:45

据我所知,貌似innodb使用表空间,即使有碎片也看查不出来。
只能定期的optimize table来清理碎片。

mlxahcf 发表于 2012-03-08 10:48

optimize table这个语句是不是只能对myisam表有用??

shanchao7932297 发表于 2012-03-08 11:04

对innodb也有用,系统会自动把它转成 alter table 的形式。

小版主杀手 发表于 2012-03-08 11:24

定期检查mysql中 `information_schema`.`TABLES`字段,查看 DATA_FREE 字段,大于0话,就表示有碎片

ALTER TABLE table_name ENGINE = Innodb;

mlxahcf 发表于 2012-03-08 14:16

查了下`information_schema`.`TABLES`字段,查看 DATA_FREE 字段,绝大多数表的此字段的值都为635093123072,难道碎片有这么大??请高手指导

RogerZhuo 发表于 2012-03-08 15:12

回复 6# mlxahcf


    这个查询结果,和show table status from your database\G;
从你的来看,这些表是用的innodb,而且是共享表空间的,这么大的空间,其中有一部分是undo 空间,
是可用的,只是mysql不会回收。

innodb的alter table engine=innodb,虽然是空操作,记得是lock表,而且是重新建表的。
所以生产系统的,大表空间的,操作要慎重
在主从架构中,此操作也会被复制到Slave上,影响slave的

可以在执行时SET SQL_LOG_BIN=0,记此操作不被记录到binlog中

2, innodb的独立表空间,此操作比较方便,可以对比.ibd文件
3,mysiam就是上面所说的操作,show table status中的data free字段能正常反应出来碎片情况。

kerlion 发表于 2012-03-08 15:28

RogerZhuo 发表于 2012-03-08 17:10

回复 8# kerlion


    有相关经验吗? 可以分享呢!!
上次在项目中,我提过这种方案,但是担心崩溃,所以一直没有搞

飞鸿无痕 发表于 2012-03-09 11:02

在我们的项目中,生产环境一律采用独立的表空间,对于小表的话直接用ALTER TABLE table_name ENGINE = Innodb;回收表空间,对于大表就不能直接采用这种方式,因为会造成长时间的所表。可以采用新建表转移数据,然后删除旧表的形式
页: [1] 2
查看完整版本: 查看innodb表碎片及清理