您的位置:首页 > 数据库 > MySQL

MySQL数据类型选择优化

2016-03-17 00:00 691 查看
选择正确的数据类型对于获得高性能至关重要,数据类型选择可以有以下原则:
1,更小的通常更好;更小的数据类型通常更快,因为它们占用更少的磁盘,内存,CPU缓存,处理时需要的 CPU周期也少。
2,简单就好;简单的数据类型通常需要更少的CPU处理周期,比如整型比字符串类型操作代价更低,因为字符集和校对规则使字符比较比整理更复杂,比如:通常可以使用内建日期来代替字符串存储日期,整型来存储IP地址;
3,尽量避免NULL;Null对于mysql来说更难优化,如果要列要加索引,尽量设置Not NULL;

具体类型选择
上面第一步确定了合适的大类型:数字,字符串,日期等,然后就是具体类型的选择了,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),但是无符号数据范围扩大一倍。
备注:
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值的字符串,尽量避免使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: