《高性能MySQL》MySQL选择数据类型的几个原则

作者: JONE 分类: 编程 发布时间: 2018-09-12 17:06

摘自《高性能MySQL》

mysql支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要。不管是哪种类型的数据,下面几个简单的原则有助于做出更好的选择。

1. 更新的通常更好

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

但是要确保没有低估需要存储的值的范围,因为在schema中的多个地方增加数据类型的范围是一个非常耗时间和痛苦的操作。如果无法确定哪个数据类型是最好的,那么就选择你认为不会超过范围的最小;类型。(如果系统不是很忙,或者存储的数据量不多,或者是在刻意轻易修改设计的早期阶段,那之后修改数据类型也比较容易)。

2. 简单就好

简单数据类型的操作通常需要更少的cpu周期。例如整型比字符串操作代价更低,因为字符集和校对规则(排序规则)使字符比较比整型更复杂。这里有两个例子:一个是应该使用mysql内建的类型而不是字符串来存储日期和时间,另一个是应该用整型存储IP地址。

3. 尽量避免NULL

很多表都包含NULL(空值)的列,即使应用程序并不需要保存NULL也是如此,这是因为NULL是列的默认属性。通常情况下,最好指定列为 NOT NULL,除非真的需要存储NULL值。

如果查询中包含可为NULL的列,对MySQL来说更难优化,因为可为NULL的列是的索引、索引统计和值比较都更复杂。可为NULL的列会使用更多的存储空间,在MySQL里也需要特殊处理。当可为NULL的列被属于时,每个索引记录需要一个额外的直接,在MyISAM里甚至还可能导致固定大小的索引(例如只有一个证书列的索引)变成可变大小的索引。

通常把可为NULL的列改为NOT NULL带来的性能提升比较小,所以调优时没有必要首先在schema中查找并修改掉这种情况,除非确定这会导致问题。但是,如果计划在裂伤建索引,就应该尽量避免设计成可为NULL的列。

当然也有例外,例如值得一提的是,在InnoDB使用单独的位(bit)存储NULL值,所以对于稀疏数据有很好的空间效率,但这一点不适用与MyISAM。

在为列选择数据类型时,第一步需要确定合适的大类型:数字、字符串、时间等。