### 8.5.1 优化 InnoDB 表的存储布局

-   一旦您的数据达到稳定的大小，或者不断增长的表增加了数十或数百兆字节，请考虑使用`优化表`语句来重组表并压缩任何浪费的空间。重组的表需要更少的磁盘 I/O 来执行全表扫描。这是一种简单的技术，可以在其他技术（例如提高索引使用率或调整应用程序代码）不实用时提高性能。

    `优化表`复制表的数据部分并重建索引。好处来自改进的索引内数据打包，以及减少表空间和磁盘上的碎片。好处因每个表中的数据而异。您可能会发现某些收益显着而其他收益不显着，或者收益会随着时间的推移而减少，直到您下一次优化表。如果表很大或者正在重建的索引不适合缓冲池，则此操作可能会很慢。向表中添加大量数据后的第一次运行通常比以后的运行慢得多。

-   在`InnoDB`, 有很长的`首要的关键`（无论是具有长值的单列，还是形成长复合值的几列）都会浪费大量磁盘空间。行的主键值在指向同一行的所有二级索引记录中重复。（看[第 15.6.2.1 节，“聚集索引和二级索引”](innodb-index-types.html).) 创建一个`自动递增`如果您的主键很长，则列作为主键，或者索引一个长的前缀`VARCHAR`列而不是整个列。

-   使用[`VARCHAR`](char.html)数据类型而不是[`字符`](char.html)存储可变长度的字符串或具有许多列的`空值`价值观。一种[`字符（*`ñ`*)`](char.html)列总是需要*`ñ`*存储数据的字符，即使字符串更短或其值为`空值`.较小的表更适合缓冲池并减少磁盘 I/O。

    使用时`袖珍的`行格式（默认`InnoDB`格式）和可变长度字符集，例如`utf8`要么`sjis`,[`字符（*`ñ`*)`](char.html)列占据可变数量的空间，但仍然至少*`ñ`*字节。

-   对于大表或包含大量重复文本或数字数据的表，请考虑使用`压缩`行格式。将数据带入缓冲池或执行全表扫描所需的磁盘 I/O 较少。在做出永久性决定之前，请测量您可以通过以下方式实现的压缩量`压缩`相对`袖珍的`行格式。
