mysql数据类型很多,选择合适的数据类型对于提高性能大有裨益。概况来说,尽可能选择小而简单的合适的数据类型。
- 小而简单
可以减小存储空间的消耗,IO的消耗,更利于缓存到内存,同时计算复杂度也会低。 - 尽量避免使用NULL
有NULL的列值会使索引、索引统计和值比较更加复杂;NULL列会使用更多的存储空间,可为NULL列做索引时,每个索引需要一个额外的字节。
常用类型
- 整数类型
TINYINT(8位),SMALLINT(16位),MEDIUMINT(24位),INT(32位),BIGINT(64位),它们的范围是-2的(n-1)次方到2的(n-1)次方-1。如果选择了UNSIGNED表示非负,它可以使整数最大值提高一倍,有符号和无符号使用相同的存储空间,具有相同的性能。
为整型指定宽度,如INT(11),对于存储来说INT(1)和INT(20)是相同的,它不会限制值的合法范围,只是规定了MySQL与客户端的交互应该显示多少位而已,比如你向INT(1)中插入了123456值,数据库中其实已经存入了123456,只是对于客户端查出来是1而已。
尽量选择合适范围的类型。 - 实数类型
FLOAT(4字节),DOUBLE(8字节),DECIMAL。DECMIAL存储精确的小数,但是效率低,可以考虑用整数代替。 - 字符串类型
VARCHAR用于存储变长字符串,会删除末尾空格,仅存储必要的空间,会比定长字符串节省空间。会用1或2个额外字节记录字符串的长度,每次UPDATE会重新计算字符串的长度,还有可能会导致页分裂(字符串变长,空间不够)。CHAR是定长的,每个列无论字符串长度大小都会分配固定存储空间,CHAR适合存储字符很短,或者所有值接近一个长度时。使用CHAR(1)和VARCHAR(1)来存储Y或N时,CHAR需要一个字符,而VARCHAR需要两个,因为还有一个长度字节。
BLOB和TEXT类型是为存储大数据而设计的,可以做部分前缀索引。
使用枚举代替字符串类型,枚举可以把一些重复的字符串存储成一个预定义的集合,MySQL在存储枚举时非常紧凑,MySQL在列中保存值为枚举中的位置整数。枚举最不好的是字符串是固定的,添加或删除必须使用ALTER TABLE。因此对于未来会改变的字符串,使用枚举不是一个好主意,除非能接受在枚举末尾添加元素,由于枚举有一个映射转换过程,所以枚举虽然能减少存储空间,但是也会增加一些额外开销。 - 时间和日期类型
TIMESTAMP(4字节)比DATETIME(8字节)空间效率更高,TIMESTAMP时区相关,只能表示到2038年。 - 位数据类型
一般在应用中尽量避免使用BIT,对于大部分应用来说最好是不用。