选择正确的数据类型对于得到高性能相当重要,数据类型选择能够有如下原则:mysql
1,更小的一般更好;更小的数据类型一般更快,由于它们占用更少的磁盘,内存,CPU缓存,处理时须要的 CPU周期也少。sql
2,简单就好;简单的数据类型一般须要更少的CPU处理周期,好比整型比字符串类型操做代价更低,由于字符集和校对规则使字符比较比整理更复杂,好比:一般能够使用内建日期来代替字符串存储日期,整型来存储IP地址;数据库
3,尽可能避免NULL;Null对于mysql来讲更难优化,若是要列要加索引,尽可能设置Not NULL;缓存
具体类型选择oracle
上面第一步肯定了合适的大类型:数字,字符串,日期等,而后就是具体类型的选择了,MySQL能够存储相同的数据类型,好比:datetime,timestamp,可是须要的物理空间不一样(内存,磁盘空间),timestamp只占用了datetime一半的存储空间,timestamp容许的时间范围要小得多。性能
基本类型选择规则:优化
1)整数类型:两种类型的数字,整数和实数;tinyint,smallint,mediumint,int,bigint(8,16,24,32,64位,能够存放-2^7-2^7-1的数据),无符号类型与有符号类型占用一样的空间(0-255与-128-127),可是无符号数据范围扩大一倍。spa
备注:排序
MySQL能够为整形指定宽度,INT(11),对大多数应用是没有意义的,它不会限制合法的范围,只是对mysql客户端限制了显示字符的个数,存储和计算来讲INT(20)与INT(1)是同样的。索引
整数计算,mysql采用的是64位BIGINT整数,32位环境也是如此。
2)实数类型:Decimal(18,9),mysql5.0以上版本将数字打包保存到一个二进制字符串(4个字节存9个数字, 2^(4*8-1));Decimal最多65个数字。Decimal只是做存储使用,计算时会换算成Double。
Decimal(18,9):小数点先后各占4byte,小数点1byte,4+1+4=9byte
Decimal须要额外的空间和计算开销,应该尽可能在小数计算时才使用Decimal(财务数据),但在数据量比较大的时候,能够考虑用bigint替代Decimal,好比:123.123 = 123123 (整数)/1000(精确度),这样能够避免浮点运算不精确,也减小了为精确计算使用Decimal的代价。
浮点类型比Decimal占用更少的空间,Float 4byte,Double 8byte,和整数类型同样,只是占用空间不一样,实际上实数运算时mysql仍是会采用double来计算。
3)字符串类型:Varchar/Char
Varchar:可变长存储,比定长存储节省空间;varchar须要额外1-2byte记录字符串长度,若是列的最大长度<=255,使用1byte表示,不然2byte表示,varchar(1000)实际须要1002bytes表示。
char:定长,自动截断字符串尾部空格,不易产生碎片,char(1),varchar(1)分别会占用1,2个字节。适合存储定长字符串,好比MD5值。
varchar(5)与varchar(255)存储"hello"的空间开销是同样的,可是内存开销和排序是不同的。
binary/varbinary:存储二进制字符串(字节码,空表示为\0)
备注:utf-8字符集的varchar(1000)列,每一个字符3bytes,最大占用空间=3*1000bytes。这里之前有一种误解,varchar(1000)存储utf-8字符时,存储了1000/3个字符,实际是存储了1000个字符,只是占用空间是3kbytes,因此mysql5.0以上varchar的存储单位是字符,可是oracle数据库是以字节为单位。
4)BLOB/TEXT类型:分别采用二进制和字符方式存储
5)日期和时间类型:mysql可以存储最小时间粒度为秒(MariaDB 支持微秒级别)
datetime:1001-9999年,精度秒,8bytes,与时区无关
timestmp:保存1970-1-1以来的秒数,4bytes,与时区有关
5)位类型: bit:mysql看成字符串类型来存放,bit(1)表示二进制0/1值的字符串,尽可能避免使用。