mysql数据类型选择

mysql数据类型很多,选择合适的数据类型对于提高性能大有裨益。概况来说,尽可能选择小而简单的合适的数据类型。

  • 小而简单
    可以减小存储空间的消耗,IO的消耗,更利于缓存到内存,同时计算复杂度也会低。
  • 尽量避免使用NULL
    有NULL的列值会使索引、索引统计和值比较更加复杂;NULL列会使用更多的存储空间,可为NULL列做索引时,每个索引需要一个额外的字节。

常用类型

  1. 整数类型
    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而已。
    尽量选择合适范围的类型。
  2. 实数类型
    FLOAT(4字节),DOUBLE(8字节),DECIMAL。DECMIAL存储精确的小数,但是效率低,可以考虑用整数代替。
  3. 字符串类型
    VARCHAR用于存储变长字符串,会删除末尾空格,仅存储必要的空间,会比定长字符串节省空间。会用1或2个额外字节记录字符串的长度,每次UPDATE会重新计算字符串的长度,还有可能会导致页分裂(字符串变长,空间不够)。CHAR是定长的,每个列无论字符串长度大小都会分配固定存储空间,CHAR适合存储字符很短,或者所有值接近一个长度时。使用CHAR(1)和VARCHAR(1)来存储Y或N时,CHAR需要一个字符,而VARCHAR需要两个,因为还有一个长度字节。
    BLOB和TEXT类型是为存储大数据而设计的,可以做部分前缀索引。
    使用枚举代替字符串类型,枚举可以把一些重复的字符串存储成一个预定义的集合,MySQL在存储枚举时非常紧凑,MySQL在列中保存值为枚举中的位置整数。枚举最不好的是字符串是固定的,添加或删除必须使用ALTER TABLE。因此对于未来会改变的字符串,使用枚举不是一个好主意,除非能接受在枚举末尾添加元素,由于枚举有一个映射转换过程,所以枚举虽然能减少存储空间,但是也会增加一些额外开销。
  4. 时间和日期类型
    TIMESTAMP(4字节)比DATETIME(8字节)空间效率更高,TIMESTAMP时区相关,只能表示到2038年。
  5. 位数据类型
    一般在应用中尽量避免使用BIT,对于大部分应用来说最好是不用。