良好的逻辑设计和物理设计是高性能的基石,选择正确的数据类型对于获得高性能至关重要。

简单的原则:

  • 更小的通常更好。应该尽量使用可以正确存储数据的最小数据类型。
  • 简单更好。简单数据类型的操作通常需要更少的CPU周期。
  • 尽量避免NULL

整数类型:

TINYINT 8bit
SMALLINT 16bit
MEDIUMINT 24bit
INT 32bit
BIGINT 64bit

支持UNSGINED属性,表示有无符号。

实数类型:

DECIMAL
FLOAT 32bit
DOUBLE 64bit

MySql使用DOUBLE作为内部浮点计算的类型
浮点数表示:符号部分+指数部分+尾数部分
定点数表示:10进制分割存储
可以考虑使用BIGINT代替DECIMAL
**

字符串类型:

VARCHAR

  • 用于存储可变长字符串,仅使用必要的空间
  • 需额外使用1或2个字节计算字符串的长度
  • 适合字符串列的最大长度比平均长度大很多的场景

    CHAR

  • 存储定长字符串

  • 根据需要采用空格进行填充以方便比较
  • 适合存储很短/长度近似/经常变更

    BINARY和VARBINARY

    二进制比较的优势并不仅仅体现在大小写敏感上。MySql比较BINARY字符串时,每次按一个字节,并且根据该字节的数值进行比较。因此,二进制比较比字符串比较简单很多,所以也就更快。

    BLOB和TEXT

  • 二者都是为存储很大的数据而设计的字符串数据类型

  • BLOB存储的是二进制数据,没有排序规则或字符集
  • MySql把每个BLOB和TEXT值当作一个独立的对象处理。存储引擎在存储时通常会做特殊处理
  • MySql讲二者的前max_sort_length字节做排序

日期和时间类型:

DATETIME

8个字节,表示1001年到9999年,精度为秒,把日期和时间封装到格式为YYYYMMDDHHMMSS的整数中,与时区无关。

TIMESTAMP

4个字节,表示从1970年1月1日午夜(格林尼治时间)以来的秒数,1970年到2038年,显示的值依赖时区。
特殊属性:

  • 默认情况下,如何插入时没有指定第一个TIMESTAMP列的值,MySql则设置这个列的值为当前时间
  • 在插入一行记录时,MySql默认也会更新第一个TIMESTAMP列的值(除非显示指定)
  • TIMESTAMP默认为NOT NULL

位数据类型:

底层都是字符串类型

BIT

可以使用BIT列在一列中存储一个或多个true/false值。BIT列的最大长度为64
SET

范式和反范式

范式的优点

  • 范式化的更新操作通常比反范式化更快
  • 当数据较好地范式化时,就只有很少或者没有重复数据,所以只需要修改更少的数据
  • 范式化的表通常更小,可以更好地放在内存里,所以执行操作会更快
  • 很少有多余的数据意味着检索列表数据时更少需要DISTINCT和GROUP BY

    范式的缺点

  • 通常需要关联表,也可能使一些索引策略无效

    反范式的优点

  • 数据都在一张表中,可以很好的避免关联

  • 能使用更有效的索引策略