Schema与数据类型优化
选择优化的数据类型
1.更小的通常更好
占用更少磁盘,内存和CPU缓存,处理的CPU周期也更少
2.简单就好
减少CPU操作周期,整型比子夫操作代价更低,
3.尽量避免null
null值对sql更难优化,null的列使得索引,索引统计和值得比较更为复杂,且null会使用更多存储空间;
为null的列被索引,每个索引记录需要额外的字节。
通常把null列改为not null带来新能提升较小,所以调优时没必要首先定位这种问题,除非确定这会导致问题。但是计划
在列上建立索引,尽量避免设计null的列。
当然也有列外,Innnodb使用单位的为(bit)存储null值,所以对于稀疏数据(很多为null,少数列有值)有很好的空间效率
不适用于mMyIsam
列如:TIMESTAMP只使用DATETIME一般的存储空间,根据时区变化,具有自动更新能力。TIMESTAMP允许的时间范围 更小,也是他的障碍。
1:整数类型
mysql支持一下几种类型整数:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT。分别8,16,24,32,64为存储空间,范围-2(N-1)-2(N-1)-1,其中N是存储空间的位数。
整数还有UNSINGED属性,表示不允许负值,可以使正数的上限提高一倍,但是存储空间一样,性能一样。
整数计算一般使用64位BIGINT整数,所以在代码中接收类似count(id)的结果时,要定义成BigInteger,不然会报错,
对于存储和计算来说,INT(1)和INT(20)是一样的。
mysql可以为整数类型指定宽度,列如int(11),没有意义,他不会限制值得合法范围,只是用来显示值得字符个数。
2:实数类型
实体是带有小数部分的数字。 float double 我们不仅可以用与存储小数部分,还可以使用DECIMAL(精确计算)存储比BIGINT(能表示20位,18..)还大的整数。之前看到公司老系统中使用DECIMAL来表示数字类型一直不明白,可能存在这个原因。
在需要对小数进行精确计算时 如财务数据,才使用DECIMAL来表示(mysql5.0以上)
3:字符串类型
varchar和char在不同的存储引擎中存储方式不一样。
varchar
varchar类型用于存储可变长字符串,比定长类型更节省空间,它仅使用必要的空间,如varchar(20) "abc" 仅使用3个字节,但是它会再拿出1或2个字节来记录字符串长度(大于255字节为2个),存储时会保留末尾空格,对于varchar来说最好的策略是只分配真正需要的空间。
使用情况:如果字符串列的最大长度比平均长度大很多;列的更新很少,所以碎片不是问题;使用了UTF-8这样的复杂字符集。
Char
char 类型是定长,会删除所有的末尾空格,会根据需要采用空格进行填充以方便比较。
使用情况:适合存储很短的字符串,或者所有值都接近一个长度,比如char 非常适合存储密码的MD5值,因为他是一个定长。我们可以使用char(1) 来存储只有Y和N的值,它只需要一个字节,而如果使用varchar(1)会占用两个字节。对于经常改变的数据,char也更好。