这两天正在看高性能MySQL,对于当前知识的一个完善,所以只是一些零星的知识点,并不是系统的总结,希望对看到的朋友有所帮助,一起成长!
1.更小的通常更好
尽量使用可以正确存储数据的最小数据类型,更小的数据类型通常更快,因为它占用更少的磁盘、内存和CPU缓存,处理时需要的CPU周期也更少
2.简单就好
简单的类型需要更少的CPU周期,比如:整型比字符操作代价更低,因为字符集和校对规则是字符比较比整型比较更复杂
3.尽量避免NULL
可为NULL的列使得索引,索引统计和值比较更复杂
可为null的列会使用更多的存储空间,在mysql里也需要特殊处理
可为null的列被索引时,每个索引记录需要一个额外的字节
如果计划在字段上建立索引,尽量避免设计成可为null的列
当然也有例外,对于稀疏数据有很好的空间效率,但不适用MyISAM(稀疏数据:只有少数的列为非null值,其他大部分数据都为NULL值)
整数和实数类型
DECIMAL用于存储精确的小数(该字段慎用,除非必要)
CPU不支持对DECIMAL的直接计算,MySQL服务器自身实现了DECIMAL的高精度计算,因为需要额外的空间和开销,应尽量只在对小数进行精确计算时使用DECIMAL
CPU直接支持原生的浮点计算,所以浮点运算明显很快(FLOAT, DOUBLE)
也可以使用BIGINT替代DECIMAL,将对应的值的小数位乘以相应的倍数
VARCHAR和CHAR类型
VARCHAR类型用于存储可变长字符串,它比定长类型更节省空间,因为它仅使用必要的空间,一般需要1或2个额外的字节记录字符串的长度
使用场景:
1.字符串的列的最大长度比平均长度大很多,
2.列更新的少,所以碎片不是问题(如果行是变长的话,在update时可能使行变得比原来更长,这就需要做额外的工作)
3.使用了像UTF-8这样复杂的字符集,每个字符都是用不同的字节数进行存储
CHAR类型是定长
使用场景:
适合存储很短的字符串,或者所有值都接近同一个长度,例如:存储密码的MD5值,这是一个定长值
对于经常变更的数据,因为定长的CHAR类型不容易产生碎片
对于非常短的列,CHAR比VARCHAR在存储空间上更有效率,例如长度为1的列,CHAR需要一个字节,而VARCHAR却需要两个字节,因为还需要一个字节记录长度