第04章 Schema与数据类型优化
Posted perfy576
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第04章 Schema与数据类型优化相关的知识,希望对你有一定的参考价值。
反范式的设计可以加快某些类型的查询,但也可能是的另一些类型的查询变慢.添加计数表和汇总表是一种很好的优化查询的方式.
1 选择合适的数据类型
通常原则是:
- 更小的通常更好:一般情况下应该尽量使用可以正确存储数据的最小数据类型.更小的数据类型通常更快,因为他们占用很少的磁盘,内存和cpu缓存,在处理的时候需要的cpu周期也更少.
- 简单就好:简单数据类型的操作通常用更少的cpu周期.比如整数比字符操作代价低,因为字符集和校对规则使得字符比整形更复杂.比如,mysql使用內建类型来存储时间和日期,而不是使用字符串.另外应该用整形存储ip地址
- 尽量避免 NULL:通常情况下最好指定列为
NOT NULL
,如果查询中包含可为NULL
的列,对mysql来说更难优化,因为NULL
的列使索引,索引统计和值都比较复杂,而且可能需要更多的存储空间.但是把NULL
改为NOT NULL
带来的性能提升比较少.
1.1 整数类型
有两种类型的数字:整数和实数,如果存储整数可以使用TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT,分别对应8,16,24,32,64位存储空间.
加上UNSIGNED属性,表示不允许负值,也就是无符号整数.有符号整数和无符号整数具有相同的性能和相同的存储空间.
Mysql中整数计算一般使用64位的BIGINT整数,即使在32位环境下也是使用64位整数.
类型后面的括号,如INT(8)
表示显示为位数,和存储无关.
1.2 实数类型
实数是带有小数部分的数字,由DECIMAL,FLOAT,DOUBLE,三种
其中DECIMAL可以存储比BIGINT更大的整数.
FLOAT和DOUBLE都支持标准的浮点运算(近似计算).分别使用4,8字节存储
DECIMAL类型用于存储精确小数.cpu不支持DECIMAL的直接计算,因此服务器自身实现了DECIMAL的高精度计算.DECIMAL在存储的时候,每4个字节存储9个数字.小数点单独占用一个数字.最多支持65个数字.
实数类型在定义的时候可以是DECIMAL(12,5)
,表示,总长12位,小数点后5位.
1.3 字符串类型
1.3.1 VARCHAR和CHAR
VARCHAR和CHAR是两种最要的字符串类型.其存储方式和存储引擎有关.当在定义的时候加上括号char(3)
表示最大存储3个字符,而不是字节.需要占据多少空间,需要根据字符集来确定
varchar存储可变长字符串,是最常见的字符串类型.比定长的char更加节省空间.varchar使用1或是2个额外的字节记录字符串长度.节省了存储空间,对性能也有帮助,但是当修改后字符串比原来更长的时候,需要分配额外的空间.具体的不同存储引擎不同.因为有了长度记录,因此最后的