a.选择数据类型的简单原则
1.更小通常更好:要试着使用能正确存储和表示数据的最小类型.更小的数据类型通常更快,因为它们使用了更小的磁盘空间、内存和CPU缓存,而且需要的CPU周期也更少.
2.简单就好:越简单的数据类型需要的CPU周期越少.例如,比较整数的代价小于比较字符串,因为字符集和排序是字符串比较更复杂.应该使用MySQL内建的类型来保存日期和时间,而不是字符串,应该使用整数来表示IP而不是字符串.
3.尽量避免NULL:要尽可能的把例定义为NOT NULL,因为MySQL难以优化使用了可空例的查询,它会使索引、索引统计和值更加复杂.可空例需要更多的存储空间,还需要在MySQL内部进行特殊处理.当可控例被索引的时候,每条记录都需要一个额外的字节,还能导致MyISAM中固定大小的索引变成可变大小的索引.即使要在表中存储"没有值"的字段,可以考虑0或者空字符串来代替.如果计划对列进行索引,就要尽量避免把它设置成可空.
b.MySQL数据类型
1.数字类型
数字有2种类型:整数和实数
a.整数:整数可以使用TINYINT、SMALLINT、MEDIUMIN、INT、BIGINT,分别需要8,16,24,32,61位存储空间.它们的范围为-2(N-1次方)到2(N-1次方)+1,N即前面所说的存储空间.同时,整数类型还有可选的UNSIGNED属性,它表示不允许负数,同时把正上限提高了一倍.UNSIGNED和SIGNED类型占用的存储空间和性能都是一样的.MySQL还可以为整数类型定义宽度,这对于大多数应用是没有意义的,它不会限制值的范围,值规定了MySQL的交互工具(如:MySQL客户端)用来显示字符的个数,对于存储和计算INT(1)和INT(20)是一样的.
b.实数:实数有分数部分,可以使用DECIMAL保存比BIGINT还大的整数,MySQL同时支持精确和非精确类型.
FLOAT和DOUBLE类型支持使用标准的浮点运算进行近似计算,浮点数的具体运算和平台有关.
2.字符串类型
a.VARCHAR和CHAR类型:这两种类型保存到内存或磁盘的具体实现依赖于存储引擎,以InnoDB或MyISAM为例:VARCHAR保存了可变长度的字符串,是使用最多的字符串类型,它比固定长度的字符串占用更少的存储空间(注:使用ROW_FORMAT=FIXED创建的MyISAM表,它为没行使用固定长度的空间,可能造成资源浪费),它使用额外的1到2字节来保存值的长度,如果列的最多长度小于或等于255则使用1字节,否则就使用两字节.CHAR的长度是固定的,MySQL总会为特定数量的字符分配足够的空间,当保存CHAR值的时候,MySQL会去掉末尾的空间.
CHAR(1)和VARCHAR(1)中的1代表的是字符而不是字节.
3.BLOB和TEXT
BLOB和TEXT分别以二进制和字符形式保存大量数据
字符类型有:TINYTEST、SMALLTEXT、TEXT、MEDIUMTEST、LONGTEXT,二进制类型有:TINYBLOB、SMALLBLOB、BLOB、MEDIUMBLOB、LONGBLOB.BLOB等同于SMALLBLOB,TEXT等他于SMALLTEST.BLOB和TEXT的唯一区别是BLOB保存的是二进制数据没有字符集和排序规则,但是TEXT有字符集和排序规则.MySQL对BLOB和TEXT列的排序方式和其他类型不同,它不会按照字符串的完整长度进行排序,而是按照max_sort_length规定的前若干个字节进行排序,如果只按照开始的几个字符排序,就可以减少max_sort_length的值或者使用ORDER BY SUBSTRING(column,length).
4.ENUM
有时可以用ENUM来代替传统的字符串类型,ENUM列可以存储65535个不同的字符串,MySQL以非常紧凑的方式保存它们,根据列表中值的数量,MySQL会将它们压缩到1到2个字节.MySQL在内部把它们每个值都保存为整数,以表示值在列表中的位置,并且还保留一份"查找表"来表示整数和字符串在表.frm文件中的映射关系.注:ENUM排序是按照数字顺序进行排序的而不是字符串.
5.日期和时间类型
a.DATETIME,这个类型能保存大范围的的值,从1001到9999,精度为秒,它把日期和时间封装在一个格式为YYYYMMDDHHMMSS的整数中,与时区无关,它使用了8字节存储空间
b.TIIMSTAMP,保存了自1970年1月1日午夜以来的秒数,TIMESTAMP只使用了4字节的空间,因此它只能表示1970到2038年,与时区有关.
c.选择标识符
为标识符列选择合适的数据类型是非常重要的.整数通常是标识符的最好选择,因为它速度快并且能使用AUTO_INCREMENT,要尽量避免使用字符串做标识符,因为它占用了很多空间并且比整数要慢.特别注意不要在MyISAM表 上使用字符串标识符,因为MyISAM默认为字符串使用了压缩索引,这使查询更慢.
《高性能MySQL》-数据类型
原创
©著作权归作者所有:来自51CTO博客作者dsfy2011的原创作品,请联系作者获取转载授权,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
Mysql 表管理 数据类型 数据批量处理 表头基本约束
案例1:表管理 案例2:数据类型 案例3:数据批量处理 案例4:表头基本约束
mysql 表管理 数据类型 数据批量处理 表头基本约束 -
高性能MySQL笔记06_优化数据类型(上)笔记 jvm 算法 数据库