MySQL 数据类型选择原则

  1. 满足需求的前提使用更小长度的数据类型
    数据类型越小,处理数据越快,占用的磁盘、内存和 CPU缓存越少,处理时需要的CPU的周期越小
  2. 使用更简单数据类型,整型优先
    简单的数据类型也意味着更少的CPU周期,比如整形比字符串的操作代价更低,因为字符集和排序使得字符之间的比较比整形之间的比较更加复杂
  3. 尽可能避免使用NULL字段
    查询中包含可为NULL的列,对Mysql来说更难优化,也会使复合索引无效。可为NULL的列会使用更多的存储空间,在Mysql中也需要特殊处理。
  4. 少用 text/blob,varchar的性能会比text高很多,如果必须要用,建议分表

几种数据类型的选择

CHAR 和 VARCHAR

  CHAR 是定长字符串类型,其长度范围是 0-255。对于 CHAR(n) 来说,当插入的字符串实际长度不足n时,插入空格进行补充保存,但在进行检索时,尾部的空格会被去掉。

CHAR 适合存储长度短,经常变更或值长度接近的字符串,比如手机号,邮箱等。相对于 VARCHAR ,CHAR 的优点是处理速度快,不容易产生空间碎片。

  VARCHAR 是变长字符串类型,其长度范围是 0-65535。对于 VARCHAR(n) 来说,n 表示最大列长度,插入的字符串实际长度不足 n 时不会补充空格。因为 VARCHAR 仅使用必要的额外空间,所以某些情况下 VARCHAR 比 CHAR 更加节省空间。

  VARCHAR 适合存储不经常变更,值长度相差较大的内容,比如文章评论等。

在这两种类型的选择上,建议从存储长度、是否定长和处理速度三个方面,按照实际需求进行选择。

DATETIME 和 TIMESTAMP

  DATETIME 和 TIMESTAMP 的主要区别是存储长度的不同,DATETIME 占用 8 字节,可以存储的时间范围是 1001-9999。

  TIMESTAMP 为 4 字节,存储范围是 1970-2038,因为其底层是采用 INT 类型存储,所以只能存储到 2038-01-19 03:14:07。另外,TIMESTAMP 的展示与时区相关,所以值为 0 时在不同的时区显示值会有差别。

  另,datetime 和 Timestamp 都只能精确到秒,如果需要更加精确的时间,可以采用 BIGINT 来存储时间

小数的保存

  可用 FLOAT 和 DOUBLE 存储,但可能会精度不准。

  也可以考虑将小数乘于相应的倍数,然后用 BIGINT 来存储。

  对于需要高精度的数字(如金额),用 DECIMAL 类型。