设计表以尽量减少它们在磁盘上的空间。通过减少写入和读取磁盘的数据量,这可以带来巨大的改进。较小的表通常需要更少的主存,而它们的内容在查询执行期间被积极地处理。表数据的任何空间减少也会导致更小的索引,从而可以更快地处理索引。
MySQL支持许多不同的存储引擎(表类型)和行格式。对于每个表,您可以决定使用哪种存储和索引方法。为应用程序选择适当的表格式可以大大提高性能。看第15章,InnoDB存储引擎,第十六章,替代存储引擎。
您可以为表格进行更好的性能,并通过使用此处列出的技术最小化存储空间:
Innodb.
使用桌子使用动态
默认情况下的行格式。使用除此之外的行格式动态
、配置innodb_default_row_format
,或指定ROW_FORMAT
选项中的显式选项创建表
或改变表
声明。包含的紧凑型行格式,包括
袖珍的
那动态
,压缩
,以增加某些操作的CPU使用为代价减少行存储空间。如果您的工作负载是受缓存命中率和磁盘速度限制的典型工作负载,那么它可能会更快。如果很少出现受CPU速度限制的情况,那么它可能会更慢。紧凑的行格式家族也进行了优化
字符
等可变长度字符集时的列存储utf8mb3
或utf8mb4
。与ROW_FORMAT =冗余
那char(
占据了N
)N
×字符集的最大字节长度。许多语言可以主要使用单字节编写use utf8
字符,因此固定存储长度通常会浪费空间。带有紧凑的行系列格式,Innodb.
在范围内分配可变存储量N
至N
通过剥离尾随空格来×这些列的字符集的最大字节长度。最小存储长度为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个字符。