目录
三个原则
更小的通常更好
更小的数据类型通常更快,因为它们占用更少的磁盘、内存和CPU缓存,并且处理时需要的CPU周期也更少。
简单就好
简单数据类型的操作通常需要更少的CPU周期。
尽量避免NULL
如果查询中包含可为NULL的列,对MySQL来说更难优化,因为可为NULL的列使得索引、索引统计和值比较都更复杂。可为NULL的列会使用更多的存储空间,在MySQL里也需要特殊处理。当可为NULL的列被索引时,每个索引记录需要一个额外的字节,在MyISAM里甚至还可能导致固定大小的索引(例如只有一个整数列的索引)变成可变大小的索引。
1、整数类型
数据类型 | 位数(N) | 存储值范围( 到 ) |
---|---|---|
TINYINT | 8 | -128 ~ 127 |
SMALLINT | 16 | -32768 ~ 32767 |
MEDIUMINT | 24 | -8388608 ~ 8388607 |
INT | 32 | ~ |
BIGINT | 64 | ~ |
2、实数类型
数据类型 | 含义 |
---|---|
FLOAT(m,d) | 8位精度(4字节) |
DOUBLE(m,d) | 16位精度(8字节) |
DECIMAL(m,d) | 参数m<65 是总个数,d<30且 d<m 是小数位 |
因为需要额外的空间和计算开销,所以应该尽量只在对小数进行精确计算时才使用DECIMAL。但在数据量比较大的时候,可以考虑使用BIGINT代替DECIMAL,将需要存储的货币单位根据小数的位数乘以相应的倍数即可。这样可以同时避免浮点存储计算不精确和DECIMAL精确计算代价高的问题。
3、字符串类型
数据类型 | 含义 |
---|---|
CHAR | 固定长度,最多255个字符 |
VARCHAR | 可变长度,最多65535个字节 |
TINYTEXT | 可变长度,最多255个字符 |
TEXT | 可变长度,最多65535个字符 |
MEDIUMTEXT | 可变长度,最多2的24次方-1个字符 |
LONGTEXT | 可变长度,最多2的32次方-1个字符 |
注意:
- 当存储CHAR值时,MySQL会删除所有的末尾空格。
- VARCHAR需要使用1或2个额外字节记录字符串的长度:如果列的最大长度小于或等于255字节,则只使用1个字节表示,否则使用2个字节表示。
4、日期和时间类型
数据类型 | 含义 |
---|---|
TIMESTAMP | 4字节,从1970年到2038年,精度为秒,与时区有关 |
DATETIME | 8字节,从1001年到9999年,精度为秒,与时区无关 |
除了特殊行为之外,通常也应该尽量使用TIMESTAMP,因为它比DATETIME空间效率更高。有时候人们会将Unix时间戳存储为整数值,但这不会带来任何收益。用整数保存时间戳的格式通常不方便处理,所以我们不推荐这样做。