8.5.1-优化InnoDB表的存储布局
  • 当你的数据达到了一个稳定的大小,或是一张不断增长的表的大小增加了几十或几百MB,你可以考虑使用optimize table语句来重新组织表和压缩浪费的空间。重新组织的表可以减少全表扫描时的磁盘I/O。当其它优化措施,比如优化索引使用或修改应用代码不起实际作用的时候,这是一个简单直接的措施。

ptimize table 语句会复制表中的数据,并重新构建索引。带来好处的原因是优化了索引内的数据布局,减少了表空间上的碎片。每张表的优化效果可能不同,这取决于表中的数据。你可能会发现,一些表的优化效果很明显,而一些不是,或是随着时间的推移,优化效果会逐渐减少,直到下一次优化。如果表很大或者buffer pool不能容纳索引,这个操作可能会花费很长时间。添加了大量数据后的第一次运行通常会更慢。

  • 在InnoDB中,一个长的主键索引(可能是一个长的单列索引,也可能是多列组成的长的联合索引)非常浪费磁盘空间。一条记录的主键存在于每一个二级索引中(见章节 15.6.2.1,“聚簇索引和二级索引”)。如果你的主键很长,可以创建一个自增列做主键,或者是只给一个长变长字段的前缀创建索引。
  • 使用varchar类型来存储变长字符串,或者是要存储很多null值的字段。一个char(N)字段,总是会使用N个字符的空间来存储数据,即使字符串比N短,或者是null。小表更可能被buffer pool缓存,这可以减少磁盘I/O。 当行格式是compact(InnoDB的默认格式)且使用变长字符集(比如utf8mb4或sjis)的时候,char(N)类型的列占用的空间是可变的,但是仍然至少N字节。
  • 对于大表或是有大量重复文本或数字的表来说,考虑使用compressed类型的行格式。这样在将数据加载到buffer pool,或是执行全表扫描的时候,会消耗更少的磁盘I/O。在你确定这样做之前,请先评估一下采用这两种行格式时系统的压力。