4.1 选择优化的数据类型

  • 更小的通常更好: 应该尽量的使用可以正确存储数据的最小数据类型。更小的数据类型通常更快,占用更少的磁盘、内存、CPU缓存,处理时需要的CPU周期更少
  • 简单就好:简单数据类型的操作通常需要更少的CPU周期。例如整型比字符操作代价更低
  • 尽量避免NULL:
    • 通常情况下最好指定列为NOT NULL。因为如果查询中包含可谓NULL的列,对MySQL来说更难优化优化,NULL使得索引、索引统计和值比较都更复杂
    • 将NULL改为NOT NULL带来的性能提升较小

4.1.1 整数类型 TINYINT:8 bit SMALLINT:16 bit MEDIUMINT:24 bit INT:32 bit BIGINT:64 bit

以上全部都支持unsigned

MySQL可以为整数类型指定宽度,例如INT(11),但对存储和计算来说,INT(1)和INT(20)是相同的。这么做只是规定了一些交互工具(例如MySQL命令行客户端)用来显示字符的个数

4.1.2 实数类型 float(4 Byte)和double(8 Byte)类型支持使用标准的浮点运算进行近似计算 decimal类型用于存储精确的小数 浮点和decimal类型都可以指定精度

4.1.3 字符串类型 字符串长度定义不是字节数,而是字符数

varchar:

  • 用于存储可变长字符串,它比定长类型更节省空间,因为它仅使用必要空间。(一种情况例外:表使用ROW_FORMAT=FIXED创建,每一行都会使用定长存储)
  • 使用1个或2个字节记录字符串长度。例如,varchar(10)需要11 byte, varchar(1000) 需要1002 byte
  • 以下情况使用varchar是合适的:字符串列的最大长度比平均长度要大很多,列的更新很少,所以碎片不是问题。
  • InnoDB可以把过长的varchar存储为blob类型

char

  • char类型是定长的,MySQL会删除所有的末尾空格,char适合存储很短的字符串,或者所有值都接近同一个长度。
  • 对于经常变更的数据,char也比varchar要好,因为定长的cahr类型不容易产生碎片。
  • 对于非常短的列,char相比与varchar,没有记录长度的1 byte开销,效率更高。

BLOB和TEXT类型

  • BLOB和TEXT都是为了存储大数据而设计的字符串数据类型,分别采用二进制和字符方式存储
  • BLOB存储的是二进制数据,没有排序规则或字符集
  • TEXT有字符集和排序规则
  • 因为Memory引擎不支持BLOB和TEXT类型,如果查询使用了这两种类型,并且需要使用隐式临时表,将不得不使用MyISAM磁盘临时表(新版本还是?)。解决方法是,使用substring()转换为字符串

TEXT:

  • TINYTEXT
  • SMALLTEXT (TEXT的同义词)
  • TEXT
  • MEDIUMTEXT
  • LONGTEXT

BLOB:

  • TINYBLOB
  • SMALLBLOB (BLOB的同义词)
  • BLOB
  • MEDIUMBLOB
  • LONGBLOB

使用枚举类型代替字符串类型 一些重复使用的短字符串,可以考虑将其定义为枚举类型,节约开销,提升效率。
不好的地方:添加或者修改字符串,必须使用alter table。

4.1.4 日期和时间类型 DATETIME

  • 范围1001到9999,精度为秒,把日期和时间封装到YYYYMMDDHHMMSS的整数中,与时区无关,8 Byte

TIMESTAMP

  • 保存了从1970年1月1日午夜(格林尼治时间)以来的秒数,和UNIX时间戳一样。
  • 带有时区信息
  • 除特殊行为外,通常应该尽量使用TIMESTAMP,它比DATETIME空间效率更高。

4.1.5 位数据类型

  • BIT
  • SET
  • 在整数列上进行按位操作

4.1.6 选择标识符(identifier) 整数通常是标识列的最好选择

4.1.7 特殊类型数据 使用无符号整数存储IP地址,MySQL提供INET_ATON() 和 INET_NTOA() 函数在这两种表示方法间转换

4.2 MySQL schema 设计中的陷阱

  • 太多的列
  • 太多的关联
  • 过度使用枚举
  • 变相的枚举(SET)

4.3 范式和反范式

4.3.1 范式的优点和缺点

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

4.3.2 反范式化的优点和缺点 4.3.3 混用范式化和反范式化 一定的冗余

4.4 缓存表和汇总表

4.4.1 物化视图 4.4.2 计数器

4.5 加快ALTER TABLE 操作的速度

  • 影子拷贝:建一个一抹一样的副表,然后重命名