mysql5.7官网直译数据结构优化--数据大小优化

48 篇文章 0 订阅
8.4.1 Optimizing Data Size 优化数据大小
设计你的表尽量减少他们在磁盘上的占用空间。这能够使得大幅提高性能通过减少写入数据和读取数据在磁盘上。更小的表自然需要更小的内存,虽然他们的内容在查询的时候需要被激活处理。任何空间的减少对于表数据自然也会减少索引的大小,从而也能提高查询的速度。
mysql支持许多不同的存储引擎(表类型)和行格式。对于每张表,你能够决定怎么样存储和索引方法的使用。给你的应用选择合适的表格式,你能够获得巨大的性能好处。具体请看14章的InnoDB的存储引擎。和15章的修改存储引擎。
你能够获得更好的性能通过如下列出的技术来最小化表和存储引擎:
>表中列
>行格式
>索引
>连接
>标准化
表中的列
1)尽可能使用最有效的(最小的)数据类型。MYSQL有许多特别的类型能够节省磁盘空间和内存。例如,如果可以为了表更小可以使用小整形类型。MEDIUMINT通常要比选择INT更好,因为可以节省25%的空间。
2)如果可能的话声明列是NOT NULL。这能够使得SQL操作更快,通过更好的使用索引和排除检查是否每个值是NUll值。你也能节省一些存储空间,每一个列一位。如果你真的需要NULL值在你的表中,使用它们。仅仅是避免默认设置允许为NULL在每一个列中。
行格式
1)InnoDB表默认是通过使用DYNAMIC行的格式创建的。为了使用行格式而不是DYNAMIC,配置innodb_default_row_format,或者特别的行格式选项在CREATE TABLE或者是ALTER TABLE语句中给出。
紧凑的行格式,包括紧凑,动态,压缩,减少了行存储空间,在一些操作下会增加CPU的代价。如果你的工作量是一个典型的通过缓存命中率来限制并且磁盘速度可能更快。如果速度被CPU限制,那么也可能会变慢,但是这种情况很少见。
紧凑的行结构也会优化CHAR列的存储当使用一个变成的字符集例如utf8mb3或者是utf8mb4。通过ROW_FORMAT=REDUNDANT,CHAR(N)使用N*最大数量字节长度的字符集。许多语言能够通过utf8字符集写入,所以一个固定存储长度通常浪费空间。通过紧凑的行格式,innoDB允许一个可变数量的存储在范围N到N*字符集的最大字节长度对于这些列去除尾随的空格。最小存储长度是N字节去帮助典型情况下的空间更新。更多信息,请看14.8.1.2InnoDB 表的物理行结构
2)为了减小空间占用通过压缩的方式来存储表数据,特别是设置ROW_FORMAT=COMPRESSED当创建InnoDB表,或者运行myisam包命令在一个存在的MyISAM表。(InnoDB中被压缩的表也可读可写,然而MyISAM压缩后的表只能读)
3)对于MyISAM表,如果你没有任何变长度的列(VARCHAR,TEXT,或者BLOB列),一个固定尺寸的行格式可以被使用。这会更快,但是也会浪费一些空间。具体看15.2.3的MyISAM表存储格式。你能提示你想要有一个固定长度的行如果你有VARCHAR列在CREATE  TABLE选项 ROW_FORMAT=FIXED.
索引
1)主键索引应该尽可能短。这使得识别每一行都容易且有效。对于InnoDB表,主键列被复制到了每一个二级索引中,所以如果你有许多二级索引的话,一个短的主键索引能够节省不少空间呢。
2)只创建你需要提高查询性能的索引。索引对检索有好处,但是会影响插入和更新操作的速度。如果你访问表更多的是通过查询多个列的值,那你用他们一起创建一个简单的综合索引,而不是各自在每一列上创建索引。索引的第一部分应该在最常用的。如果你总是使用许多列查询表,那么索引中的第一列应该是重复最多的一列,从而获得更好压缩索引。
3)如果你更可能的是一个长字符串列有一个唯一的字符前缀,那么最好是只用这个前缀来创建,使用MySQL支持的通过列的最左部分来创建一个索引(具体请看13.1.14创建索引的语法)。索引越短越快,不仅仅是因为他们需要更少的磁盘空间,而且因为他们也给你更高的命中率关于索引缓存,并且会有更少的磁盘查找。具体请看5.1.1配置服务器。
连接
1)在一些环境下,将查询划分到两张表中查询也很常见。如果它是一个动态格式的表则这是特别真实的,并且可以使用一个更小的固定格式的表用于查找相关行,当扫描表时。
2)声明列通过恒等的信息在不同的表中用恒等的数据类型,从而加快连接基于正确的列。
3)保持列名的简单,以至于你能使用相同的名字夸不同的表并且简单连接查询。例如,在表名为customer,使用列名name代表customer_name.为了你的名字适合其他SQL服务器,尽量保证他们少于18字节。
标准化
1)正常来说,尽量保证所有数据不冗余(源自数据库理论的第三范式)。代替重复大量的值例如名字和地址等通过设计他们唯一的IDs。重复这些IDs被需要通过多个表,并且通过使用ID来连接表。
2)如果速度比磁盘空间更重要,并且维持保证了多个列数据的副本,例如在商业智能场景,你分析所有数据来自大表,你能够不管正常的规则,复制信息或者创建总结表从而获得更快的速度。
到此关于数据大小的优化就结束了,接下来我们分析的是8.4.2的Optimizing Mysql Data Types 优化mysql的数据类型
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值