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