OPTIMIZE TABLE 整理表碎片

昨天线上反应的问题. 一张委托表数据长期保持在6W 以下, 会大量insert update 定时 delete !
问题出现了以前一次上线中没有重启定时delete 脚本 导致委托表数据量激增至100W, 发现后虽然delete了, 但数据问题文件尺寸并没有减小....
昨天发现问题单条读sql运行消耗 0.1s. 用户下单速度每秒10单, 脚本消费能力每秒受读操作影响最快才不错10单. 造成数据堆积未处理,大量数据报警.检查该表数据文件大小 105M, explain 观察row 2w条 实际当前表总数5w 索引已优化至 const; 最后使用 optimize table 优化该表 5w 条记录 0.6s 优化结束! 再次 explain 观察row 150条 效果很明显, 单条读操作以控制在 0.01s 左右~!
下面是从网上找到的一些关于 optimize table 的描述!

当您的库中删除了大量的数据后,您可能会发现数据文件尺寸并没有减小。这是因为删除操作后在数据文件中留下碎片所致。

optimize table 可以去除删除操作后留下的数据文件碎片,减小文件尺寸,加快未来的读写操作。您只要在做完批量删除,或定期(如 每一两个月)进行一次数据表优化操作即可!

来看看手册中关于 OPTIMIZE 的描述:

OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...

如果您已经删除了表的一大部分,或者如果您已经对含有可变长度行的表(含有VARCHAR, BLOB或TEXT列的表)进行了很多更改,则应使用
OPTIMIZE TABLE。被删除的记录被保持在链接清单中,后续的INSERT操作会重新使用旧的记录位置。您可以使用OPTIMIZE TABLE来重新
利用未使用的空间,并整理数据文件的碎片。

在多数的设置中,您根本不需要运行OPTIMIZE TABLE。即使您对可变长度的行进行了大量的更新,您也不需要经常运行,每周一次或每月一次
即可,只对特定的表运行。

OPTIMIZE TABLE只对MyISAM, BDB和InnoDB表起作用。

注意,在OPTIMIZE TABLE运行过程中,MySQL会锁定表

发表新评论