赞
踩
MySQL支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要。不管存储哪种类型的数据,下面几个简单的原则都有助于做出更好的选择。
1.1 整数类型:tinyint、smallint、mediumint、int、bigint
1.2 实数类型:float、double、decimal
1.3 字符串类型:var、varchar、blob、text、enum、set
1.4 日期类型:datetime、timestamp
一般情况下,尽量使用可以正确存储数据的最小数据类型。更小的数据类型通常更快,因为它们占用更少的磁盘、内存和CPU缓存,并且处理时需要的CPU周期也更少。
比如:是有一个类型既可以用字符串也可以使用整型,优先选择整型。因为字符串牵涉到了字符集及校对规则等。
简单数据类型的操作通常需要更少的CPU周期。例如,整型比字符操作代价更低,因为字符集和校对规则(排序规则)使字符比较比整型比较更复杂。比如应该使用MySQL内置的数据类型而不是字符串来存储日期和时间。
通常情况下最好指定列为NOT NULL,除非真的需要存储NULL值。
如果查询中包含可为NULL的列,对MySQL来说更难优化,因为可为NULL的列使得索引、索引统计以及比较都更复杂。可为NULL的列会使用更多的存储空间,在MySQL里也需要特殊处理。当可为NULL的列被索引时,每个索引记录需要一个额外的字节。
通常把可为NULL的列改为NOT NULL带来的性能提升比较小,所以(调优时)没有必要首先考虑这种修改掉这种情况,除非确定这会导致问题。但是,如果计划在列上建索引,就应该尽量避免设计成可为NULL的列。
存储整数,可以使用这几种整数类型:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT。分就占用1、2、3、4、8个字节。
注意:
3.1.1 实数是带有小数部分的数字。MySQL既支持精确类型的存储decimal类型,也支持不精确类型存储float和 double类型(浮点类型)。decimal类型用于存储精确的小数,本质上MySQL是以字符串形式存放的。所以CPU不支持对decimal的直接计算,只是在MySQL中自身实现了decimal的高精度计算。相对而言,CPU直接支持原生浮点计算,所以浮点运算明显更快。
3.1.2 浮点类型在存储同样范围的值时,通常比decimal使用更少的空间。float使用4个字节存储,double占用8个字节,decimal里面存储65个数字,decimal对于列的空间消耗比较大,另外double比 float有更高的精度和更大的范围。
3.1.3 如何选择实数类型
MysQL支持多种字符串类型,包括VARCHAR和CHAR类型、BLOB和TEXT类型、ENUM(枚举)和SET类型。VARCHAR和 CHAR是两种最主要的字符串类型。
3.2.1 VARCHAR
VARCHAR类型用于存储可变长字符串,是最常见的字符串数据类型。它比定长类型更节省空间,因为它仅使用必要的空间(例如,越短的字符串使用越少的空间)。在内部实现上,由于是可变长,VARCHAR需要使用1或2个额外字节记录字符串的长度,如果列的最大长度小于或等于255字节,则只使用1个字节表示,否则使用2个字节。
VARCHAR节省了存储空间,所以对性能也有帮助。但是,由于行是变长的,在UPDATE时新值比旧值长时,使行变得比原来更长,这就肯能导致需要做额外的工作。如果一个行占用的空间增长,并且在页内没有更多的空间可以存储,在这种情况下,MyISAM会将行拆成不同的片段存储,InnoDB则需要分裂页来使行可以放进页内。
3.2.2 CHAR
CHAR类型是定长的,MySQL总是根据定义的字符串长度分配足够的空间。当存储CHAR值时,MySQL会删除所有的末尾空格,CHAR值会根据需要采用空格进行填充以方便比较。
3.2.3 CHAR与VARCHAR使用场景
3.2.4 BLOB和TEXT类型
BLOB和TEXT都是为存储很大的数据而设计的字符串数据类型,分别采用二进制和字符方式存储。与其他类型不同,MySQL把每个BLOB和TEXT值当作一个独立的对象处理。存储引擎在存储时通常会做特殊处理。当BLOB和TEXT值太大时,InnoDB会使用专门的“外部”存储区域来进行存储,此时每个值在行内需要1~4个字节存储一个指针,然后在外部存储区域存储实际的值。
BLOB和TEXT不同的是BLOB类型存储的是二进制数据,没有排序规则或字符集;而 TEXT类型有字符集和排序规则。
BLOB和TEXT使用时应注意:
如果表中的字段的取值是固定几个字符串,可以使用枚举列代替常用的字符串类型。枚举列可以把一些不重复的字符串存储成一个预定义的集合。MySQL在存储枚举时非常紧凑,会根据列表值的数量压缩到一个或者两个字节中,MySQL在内部会将每个值在列表中的位置保存为整数,这样的话可以大大缩小表的大小。
注意:
MySQL可以使用许多类型来保存日期和时间值,例如YEAR和 DATE以及DATETIME和TIMESTAMP。MySQL能存储的最小时间粒度为秒。
datetime 存储日期范围:1001年~9999年,与时区无关
timestamp 存储日期范围:1970年~2038年,并且跟时区有关系。
如果需要存储比秒更小粒度的日期和时间值:可以使用自己的存储格式,例如可以使用BIGINT类型存储微秒级别的时间截,或者使用DOUBLE存储秒之后的小数部分。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。