MySql 表的 Optimize 优化

发布时间: 更新时间: 总字数:586 阅读时间:2m 作者: IP属地: 分享 复制网址

MySql OPTIMIZE TABLE 重组了表数据和相关索引数据的物理存储,以减少存储空间,提高访问表时的I/O效率。对每个表所做的改变取决于该表所使用的存储引擎。

使用

optimize table <table-name>;

optimize原理

问题

mysql进行大量增删改操作,磁盘上的空间(数据空间、索引位)没有被立即收回,而是等待新的数据来填充空缺,特点如下:

  • 可以被后续的insert操作利用,但如果记录是变长的,那么不是所有的空间都能被充分利用
  • 形成碎片,影响磁盘IO

原理

optimize可以把分散(fragmented)存储的数据重新挪到一起(defragmentation),清除碎片,回收闲置的数据库空间

  • 对于MyISAM表,OPTIMIZE TABLE按如下方式操作:
  1. 如果表已经删除或分解了行,则修复表
  2. 如果未对索引页进行分类,则进行分类
  3. 如果表的统计数据没有更新(并且通过对索引进行分类不能实现修复),则进行更新
  • 对于InnoDB表,OPTIMIZE TABLE被映射到ALTER TABLE上,这会重建表。重建操作能更新索引统计数据并释放成簇索引中的未使用的空间。

限制

  • OPTIMIZE TABLE只对MyISAM, BDBInnoDB表起作用
  • 这个操作会使MySql锁定表
  • InnoDB引擎的表分为共享表空间独享表空间表,可以通过
show variables like 'innodb_file_per_table';

来查看是否开启独享表空间;独享表空间的表是无法进行optimize操作的, 因为独享表空间的表当数据删除时会重组索引并释放对应的空间

Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数