1、字段类型设计原则
- 更小的就是更好的:更小的字段类型通常更快,以为它们占用更小的磁盘、内存、缓存使用,降低I/O开销,而且需要的CPU处理周期更短。
- 简单就好:简单的数据类型需要更少的CUP周期
- 尽量避免NULL:可为NULL的列会使用更多的存储空间,当这个字段作为索引时,每个索引记录需要一个额外的字节。
- 不要用字符串存储时间和数值,他们在存储和排序上的差距较大
2、MySQL常用字段类型有:
1)数值类型:
字段类型 | 大小(字节) | 值范围 |
tinyint | 1 | (-128,127) |
smallint | 2 | (-32768,32767) |
mediumint | 3 | (-2^23,2^23-1) |
int/integer | 4 | (-2^31,2^31-1) |
bigint | 8 | (-2^63,2^63-1) |
float | 4 | |
double | 8 | |
decimal(m,n) |
- 整数类型可设置宽度,如int(1)、int(11),事实上对大多数应用它是无意义的,它们的存储是一样,性能也是一样,只是让客户端看到的信息不一样。
- decimal(m,d)允许最多65个数字,m是最大精度,d是小数精度;CUP不支持decimal的直接计算,MySQL通过内部方式实现高精度计算,相对原生浮点类型,计算速度要慢。浮点类型(float、double)在存储同样范围的值时,通常比decimal占用更少的空间,只有需要对小数进行精确计算时才使用decimal(例如财务数据)。
2)字符类型:
字段类型 | 大小(字符) | 说明 |
char | 0-255 | 固定长度字符 |
varchar | 0-65535 | 可变长字符 |
tinyblob | ||
blob | ||
mediumblob | ||
longblob | ||
tinytext | 最多存255个字符 | |
text | 最多存65535字符 | |
mediumtext | ||
longtext |
- 字符的存储方式跟引擎相关,我们这里说明的是InnoDB引擎。
- 关于char和varchar
- varchar可变字符串,相对char更节省存储空间(表的ROW_FORMAT=FIXEX例外,它的每一行都使用定长存储)
- varchar需要额外的1或2个字节记录字符串长度,当最大长度小于等于255时,使用1个字节,超过255时使用2个字节。例如varchar(10)需要11个字节存储,varchar(1000需要1002个字节存储。
- varchar节省存储空间,所以对性能有帮助。但由于行是变长的,所以update时可能使行变的更长,这样就需要额外的工作。如果一个行占用空间增长且在页内没有更多的存储空间,MyISAM会将行拆成不同的片段存储,InnoDB则需要分裂页来使行可以放到页内。
- 适合varchar类型的列:字符串列最大长度比平均长度大很多;列更新很少。char适合很短的或者长度接近的字符串。对于非常短的列,char存储上更有效率。
- char和varchar存储的是字符,使用UTF-8字符串时,每个字符占用的字节数不同。
- 关于blob和text类型
- blob存储的是2进制,没有排序规则和字符集,text有排序规则和字符集
- MySQL对blob和text的排序与其他类型不同,它只对每个列的最前max_sort_length字节而不是整个字符串排序。如果只需排序前面的一小部分,我们可以调整max_sort_length配置,或者使用order by sustering(column,length)
- MySQL不能将blob和text的全部字符串进行索引,也不能使用这些索引消除排序。
3)时间类型:
字段类型 | 大小(字节) | 值范围 | 显示格式 | 说明 |
year | 1 | [1901,2155] | yyyy | |
date | 3 | [1000-01-01,9999-12-31] | yyyy-MM-dd | 日期 |
time | 3 | HH:mm:ss | 时间 | |
datetime | 8 | yyyy-MM-dd HH:mm:ss | 日期和时间 | |
timestamp | 4 | yyyy-MM-dd HH:mm:ss.SSS | 时间戳,可精确微妙,精度的位数可定义。 |
4)其他:
字段类型 | 说明 |
bit | 二进制字符串,长度1-64 |
set | 集合类型,存储上实际是int类型 |
enum | 枚举类型,最多支持65535个枚举项。枚举类型内部使用int类型存储 |
- 在MySQL5前,bit是tinyint的同义词。bit的行为因存储引擎而已,MyISAM按位进行存储,如bit(17)有17位,它使用3个字节存储,Memory和InboDB位每个bit列使用足够存储的最少整形。MySQL把bit当做字符串类型,而不是数字类型。
- 枚举类型enum,最多有65535个枚举项,但真使用这么多项我们的应用会非常复杂。枚举适合少量枚举且相对固定的数据。
- MySQL没有bool(常用tinyint(1)或bit(1)表示布尔类型)、long类型