mysql 选择优化的数据类型
-
选择最小的数据类型,因为它们占更少的磁盘,内存和CPU缓存;
-
选择简单的数据类型,如用整型来存储ip: http://blog.csdn.net/lyd518/article/details/20701099
-
避免null,因为null会占用存储空间,null在索引列上会使索引更复杂
整数类型
-
TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT 分别使用8,16,24,32,64 位存储空间;
-
选择unsigned属性,可以使正数的上限提高一倍;
-
使不使用unsigned属性,跟性能无关;
-
int(1)和int(10)对存储和计算来说是相同的,只是规定一些mysql交互工具用来限制显示字符的个数;
实数类型
-
可以使用DECIMAL存储比BIGINT还大的整数;
-
CPU不支持DECIMAL直接计算,MYSQL服务器自身实现了DECIMAL的高精度运算,相对而言,CPU直接支持浮点运算,所以浮点运算明显更快;
-
float占用4个字节,double占用8个字节;
-
DECIMAL需要额外的空间和计算开销,所以尽量少用它;
-
DECIMAL可以使用BIGINT代替,把小数乘以数倍存储在BIGINT里面,可以避免浮点存储计算不准确和DECIMAL精度计算代价高的问题;
字符串类型
-
varchar需要一个或者两个额外的字节记录字符串长度,varchar列的长度小于或等于255个字节需要一个字节,大于255需要两个字节;
-
varchar 用于存储可变长字符串,它比定长类型更节省空间;
-
char适合存储很短的字符串,或者所有值都接近同一个长度;
-
对于经常变更的数据,char比varchar更好,因为定长的char类型不容易产生碎片;
-
对于存储非常短的列,char存储空间比varchar少,如存储“Y”或"N",采用单字节字符集,char(1)占用一个字节;varchar(1)占用两个字节;
-
当存储char值时,mysql会删除所有末尾空格,char值会根据需要采用空格进行填充比较;
-
varchar(5)和varchar(200)存储"hello"的空间开销是一样的。但更长的列会消耗更多的内存,因为mysql通常会分配固定大小的内存块来保存内部值;
BLOB和TEXT类型
-
BLOB和TEXT分别采用二进制和字符存储;
-
MYSQL不能将BLOB和TEXT列全部长度字符串进行索引,也不能用这些索引消除排序;
日期和时间类型
-
MYSQL可以存储的最小时间是秒;
-
DATETIME能保存大范围的值,从1001年到9999年,精度为秒。它把日期和时间封装到格式为YYYYMMDDHHMMSS的整数中,与时区无关,使用8个字节存储;
-
默认情况下,MYSQL以一种有顺序,无歧义的格式显示DATETIME值,例如"2014-12-12 12:12:12";
-
TIMESTAMP 用4个字节存储,和UNIX时间戳相同,它只能表示1970年到2038年,它的显示格式例如"2014-12-12 12:12:12";;
-
MYSQL提供了FROM_UNIXTIME()函数把UNIX时间戳转换成日期,并提供UNIX_TIMESTAMP()函数把日期转为UNIX时间戳;
-
TIMESTAMP 依赖于时区;
-
当插入或修改记录时,如果TIMESTAMP没有指定值,TIMESTAMP默认会保存当前时间;
-
TIMESTAMP比DATETIME的空间效率更高,尽量选择TIMESTAMP;
-
可以使用BIGINT存储微妙级别的时间戳,或者使用DOUBLE保留秒之后的小数部分;
特殊类型数据
1.IPv4地址经常被人用varchar(15)来存储,但是它32位无符号的整数,小数点将地址分四段只是为了让人容易阅读,所以整型来存储它,MYSQL用INET_ATON() 和INET_NTOA()用于这两种表示转换;