选择优化的数据类型

更小的通常更好

一般情况下,应该尽量使用可以正确存储数据的最小数据类型。更小的数据类型通常更快,因为他们占用更少的磁盘、内存和 CPU 缓存,并且处理时需要的 CPU 周期也更少。

简单就好
简单数据类型的操作通常需要更少的 CPU 周期。例如,整型比字符操作代价更低,因为字符集和校对规则(排序规则)使字符比较比整型比较更复杂。

尽量避免 NULL
通常情况下最好指定列为 NOT NULL,除非真的需要存储 NULL 值。如果查询中包含可为 NULL 的列,对 MySQL 来说更难优化,因为可为 NULL 的列使得索引、索引统计和值都更复杂。

整数类型

TINYINTSMALLINTMEDIUMINTINTBIGINT 分别使用 8、16、24、32、64 位存储空间。

有符号和无符号类型使用相同的存储空间,并具有相同的性能,因此可以根据实际情况选择合适的类型。

MySQL 可以为整数类型指定宽度,例如 INT(11),对大多数应用这是没有意义的:它不会限制值的合法范围,只是规定了 MySQL 的一些交互工具用来显示字符的个数。对于存储和计算来说,INT(1) 和 INT(20) 是相同的。

实数类型

实数是带有小数部分的数字。

因为需要额外的空间和计算开销,所以应该尽量只在对小数进行精确计算时才使用 DECIMAL。

字符串类型

VARCHAR

VARCHAR 类型用于存储可变长字符串,是最常见的字符串数据类型。它比定长类型更节省空间。

CHAR

CHAR 类型是定长的。CHAR 适合存储很短的字符串,或者所有值都接近同一个长度。

BLOB 和 TEXT

BLOB 和 TEXT 家族之间仅有的不同是 BLOB 类型存储的是二进制数据,没有排序规则或字符集,而 TEXT 类型有字符集和排序规则。

MySQL 不能将 BLOB 和 TEXT 列全部长度的字符进行索引,也不能使用这些索引消除排序。

使用枚举(ENUM)代替字符串类型

有时候可以使用枚举列代替常用的字符串类型。枚举字段时按照内部存储的整数而不是定义的字符串进行排序的。

日期和时间类型

MySQL 可以使用很多类型来保存日期和时间值,能存储的最小时间粒度为秒。

DATETIME

这个类型能保存大范围的值,从 1001 年到 9999 年,精度为秒。装到格式为 YYYYMMDDHHMMSS 的整数中,与时区无关。使用 8 个字节的存储空间。

除了特殊行为之外,通常也应该尽量使用 TIMESTAMP,因为它比 DATETIME 空间效率更高。


参考书籍: 《高性能 MySQL》