mysql eva模型_第四章 Schema 与数据类型优化

1.选择优化的数据类型

更小的通常更好

一般情况下选择可以正确存储数据的最小数据类型。更小的类型通常更快,占用更少的硬盘、内存、CPU等。但要确保没有递归需要存储的值的范围。

简单就好

简单数据类型的操作通常需要更少的CPU周期。整形比字符操作代价更低。列子:

1.用MySQL内建的类型而不是字符串来存储日期和h时间

2.另外一个用整型存储IP地址

尽量避免NULL

通常情况下指定列为NULL。如果查询中包含NULL列,MySQL更难优化。因为可为NULL的列被索引时,索引统计和值比较都比较复杂。列被指定为NULL每个索引记录都要一个额外字节。

通常把NULL列改为NOT NULL 带来的提升比较小。所以调优时没有必要在schema中查找并修改这种情况。在设计的时候,避免设计NULL列。

1.1.整数类型

TINYINT : 8位

SMALLINT:16

MEDIUMINT:24

INT: 32

BIGINT: 64

长度 -2(N-1) ~2(N-1)

整数类型有可选的UNSIGNED类型,标识不允许负值,这个大致可以使正数的范围提高一倍。

有符号和无符号类型使用相同的存储空间,并且具有相同的性能。

整数计算一般使用64位的BIGINT整数

1.2.实数类型

DECIMAL存储比BIGINT还大的整数

DECIMAL类型用于储存精确的小数

浮点和DECIMAL类型可以指定精度

在对小数进行精确计算的时候使用DECIMAL---财务数据。但在数据量比较大的时候,可以考虑使用BIGINT代替DECIMAL,将需要的货币单位根据小数乘以相应的倍数即可。避免浮点数不精确和DECIMAL精确计算代价高的问题

1.3.字符串类型

VARCHAR

1.存储可变长字符串。比定长类型更节省空间,因为它仅需要必要的空间。

列外:当表使用ROW_FORMAT= FIXED创建的话,每一行都会使用定长存储。浪费空间。

2.VARCHAR使用1-2个额外字节记录字符串的长度:列的最大长度<=255字节,则只使用1个字节表示,否则使用2个字节。假设使用Latin1字符集,VARCHAR(10)需要11个存储空间,VARCHAR(1001)需要1002个存储空间。

3.Update时可能使行变得比原来更长,导致额外工作。如果行占用的空间增长,并且在页内没有更多的空间可以存储,在这种情况下不同引擎处理方式不一样。MyISAM会将行拆成不同的片段存储,InnoDB则需要分裂页来使得行可以放进页内。

符合使用VARCHAR:

1.字符串的最大长度比平均长度大很多;

2.列的更新很少,碎片不是问题。

3.InnoDB将过长的VARCHAR存储为BLOB

CHAR

CHAR是定长的:MYSQL总是根据定义的字符串长度来分配足够的空间,并且会剔除末尾的空格。

CHAR适合存储很短的字符串,或者所有的字符串都接近于同一个长度。

对于经常改变的数据CHAR也比VARCHAR更好,因为定长CHAR不容易产生碎片。对应非常短的列CHAR比VARCHAR在空间上也更有效率。

二进制数据存储一般使用BINARY和CARBINARY类型。

使用枚举(ENUM)代替字符串类型

枚举是按照内部存储的整数而不是定义的字符串进行排序的。所以我们一般按照需要的顺序来定义枚举序列。另外也可以在查询中使用FIELD()函数显示的指定排序,但这会导致MySQL无法利用索引消除排序。

CREATE TABLE

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值