10bet官方网站文档家里
MySQL 8.0参考手册
相关的文档10bet官方网站 下载本手册 本手册摘录

8.4.1优化数据大小

设计表以尽量减少它们在磁盘上的空间。通过减少写入和读取磁盘的数据量,这可以带来巨大的改进。较小的表通常需要更少的主存,而它们的内容在查询执行期间被积极地处理。表数据的任何空间减少也会导致更小的索引,从而可以更快地处理索引。

MySQL支持许多不同的存储引擎(表类型)和行格式。对于每个表,您可以决定使用哪种存储和索引方法。为应用程序选择适当的表格式可以大大提高性能。看第15章,InnoDB存储引擎,第十六章,替代存储引擎

您可以为表格进行更好的性能,并通过使用此处列出的技术最小化存储空间:

表列

  • 尽可能使用最有效(最小)的数据类型。MySQL有许多专门的类型,可以节省磁盘空间和内存。例如,如果可能的话,使用更小的整数类型来获得更小的表。MEDIUMINT通常是一个比更好的选择INT因为一个MEDIUMINT专栏使用25%的空间。

  • 声明列是没有空如果可能的话。通过更好地使用索引和消除测试每个值是否为索引的开销,它使SQL操作更快。您还可以保存一些存储空间,每列一位。如果你真的需要表中的值,使用它们。只需避免允许的默认设置每个列中的值。

行格式

  • Innodb.使用桌子使用动态默认情况下的行格式。使用除此之外的行格式动态、配置innodb_default_row_format,或指定ROW_FORMAT选项中的显式选项创建表改变表声明。

    包含的紧凑型行格式,包括袖珍的动态,压缩,以增加某些操作的CPU使用为代价减少行存储空间。如果您的工作负载是受缓存命中率和磁盘速度限制的典型工作负载,那么它可能会更快。如果很少出现受CPU速度限制的情况,那么它可能会更慢。

    紧凑的行格式家族也进行了优化字符等可变长度字符集时的列存储utf8mb3utf8mb4。与ROW_FORMAT =冗余char(N占据了N×字符集的最大字节长度。许多语言可以主要使用单字节编写use utf8字符,因此固定存储长度通常会浪费空间。带有紧凑的行系列格式,Innodb.在范围内分配可变存储量NN通过剥离尾随空格来×这些列的字符集的最大字节长度。最小存储长度为N用于在典型情况下促进就地更新的字节。有关更多信息,请参见第15.10节“InnoDB行格式”

  • 甚至通过将表数据存储在压缩形式中,以最小化空间,即使是压缩形式,指定ROW_FORMAT =压缩当创建Innodb.表,或运行myisampack现有的命令myisam.桌子。(Innodb.压缩表是可读可写的,而myisam.压缩表是只读的。)

  • 为了myisam.表,如果您没有任何可变长度列(varchar.文本, 或者列),使用固定大小的行格式。这更快,但可能会浪费一些空间。看第16.2.3节,“MyISAM表存储格式”。即使您有,您也可以提示您想要具有固定长度的行varchar.列的创建表选项ROW_FORMAT =固定

索引

  • 表的主索引应该尽可能短。这使得识别每一行变得容易和高效。为了Innodb.表中,主键列在每个辅助索引条目中重复,所以如果有许多辅助索引,一个短的主键可以节省大量空间。

  • 只创建需要改善查询性能的索引。索引适合于检索,但会降低插入和更新操作的速度。如果您主要通过在列的组合上搜索来访问表,那么就在这些列上创建一个复合索引,而不是为每个列创建单独的索引。索引的第一部分应该是最常用的列。如果你总是从表中选择了许多列时,索引中的第一列应该是具有最重复项的第一列,以获得更好的索引压缩。

  • 如果一个长字符串列很可能在第一个字符上有唯一的前缀,那么最好只索引这个前缀,使用MySQL对在列的最左边创建索引的支持(参见第13.1.15节,“CREATE INDEX Statement”)。更短的索引速度更快,不仅因为它们需要更少的磁盘空间,而且还因为它们在索引缓存中提供了更多的命中次数,从而减少了磁盘查找次数。看第5.1.1节“配置服务器”。

加入

  • 在某些情况下,将其分成两张桌子经常扫描的表格可能是有益的。如果它是动态格式表尤其如此,并且可以使用较小的静态格式表,该表可用于在扫描表时找到相关行。

  • 在具有相同数据类型的不同表中声明具有相同信息的列,以加快基于相应列的连接。

  • 保持列名单,以便您可以在不同表中使用相同的名称并简化加入查询。例如,在名为的表中客户,列名为名称代替顾客姓名。要使您的名称携带到其他SQL服务器,请考虑将它们保持短于18个字符。

归一化

  • 通常,尝试保留所有数据不含(在数据库理论中观察到的内容第三范式)。与其重复冗长的值(如名称和地址),不如为它们分配唯一的id,根据需要在多个较小的表中重复这些id,并通过引用join子句中的id来在查询中连接表。

  • 如果速度比磁盘空间和保持多个数据副本的维护成本更重要,例如在分析大型表中的所有数据的业务智能场景中,可以放松规范化规则,复制信息或创建汇总表,以获得更快的速度。