Fork me on GitHub

高性能Mysql之数据类型优化

我们在设计表时,根据要存储的数据,选择使用哪种数据类型来保存数据,那么,选择时有哪些经验可以参考或者原则可以遵循的呢?

  • 更小的通常更好:一般情况下,尽量选用可以正确存储数据的最新数据类型,例如,能用 varchar 类型就不用 text 类型,一些用来表示状态转换的字段使用 tinyint 而不用 int 类型,更小的数据类型意味着占用的磁盘、内存和 CPU 缓存也越少,处理起来也更快。(当然,如果你不能确定哪个数据类型是最好的,就选择你认为不会超过范围的最小类型。
  • 简单就好:简单数据类型的操作通常需要更少的 CPU 周期。例如:选用整型比字符操作代价更低,因为字符集和校对规则使字符比整型更复杂。我们一般在存储日期和时间时使用 Mysql 内建类型而不是字符串。
  • 尽量避免 NULL:在设计表时,如果没有必要,尽量把字段设置为 NOT NULL.因为 可为 NULL 的列会让查询和索引都变得复杂。如果索引的字段建立在可为 NULL 的列上,索引的效率会下降很多,而且 NULL 还会占用一个字节的物理空间来保存这个 NULL,所以,想设置这个字段为空值,不推荐用 NULL,一般都用一个 0 或者空字符串来代替控制。

为列选择数据类型时,第一部是确定合适的大类型:数字、字符串,时间等。这些都是很明确就能确定的,下一步就是要选择具体的数据类型了,这时就需要你对 Mysql 的数据类型有很清晰的认知,知道哪个才是最适合的。

例如:DATETIME 和 TIMESTAMP 列都可以存储相同类型的数据:时间和日期,精确到秒。那么,我们需要选择哪个呢?

这时,就需要看需求了,DATETIME 只使用了4个字节存储数据,而 TIMESTAMP 使用了8个字节,前者能表示的时间范围更小,而且受设置的时区所影响。TIMESTAMP 可表示范围:1970-01-01 00:00:00~2038-01-09 03:14:07,DATETIME 支持的范围更宽1000-01-01 00:00:00 ~ 9999-12-31 23:59:59。

还有,char 类型 和 varchar 类型都能存储字符串,那么,选择哪个比较合适呢?

varchar 类型用于存储可变成字符串,它仅使用必要的空间,比定长类型更节省空间。以下情况适合使用 varchar 类型:

  • 字符串列的最大长度比平均长度大很多;
  • 列的更新很少;
  • 使用 UTF-8 字符集,每个字符都使用不同的字节进行存储。

char 类型是定长的:Mysql根据定义的长度分配空间,即使你并不需要用到那么多空间。所以,我们一般使用 char 类型来存储长度一般确定(或者说所有值都接近同一个长度)的数据。对于经常变更的数据, char 类型 也比 varchar更好,因为定长的 char 类型不容易产生碎片。