一尘不染

MySQL中的NULL(性能和存储)

mysql

在MySQL中,性能和存储(空间)明智地归零是什么?

例如:

TINYINT:1字节TINYINT w / NULL 1字节+以某种方式存储NULL?


阅读 315

收藏
2020-05-17

共1个答案

一尘不染

这取决于您使用的存储引擎。

在MyISAM格式中,每个行标题都包含一个位域,每个列的每个位都具有一位以对NULL状态进行编码。NULL列仍会占用空间,因此NULL不会减少存储量。参见https://dev.mysql.com/doc/internals/en/myisam-
introduction.html

在InnoDB中,每一列在行标题中都有一个“字段开始偏移量”,每列一个或两个字节。如果该列为NULL,则该字段起始偏移量的高位为开。在那种情况下,该列根本不需要存储。因此,如果您有很多NULL,则应该大大减少存储空间。参见https://dev.mysql.com/doc/internals/en/innodb-
field-contents.html

编辑:

NULL位是行标题的一部分,您不选择添加它们。

我可以想象NULL提高性能的唯一方法是,在InnoDB中,如果行中包含NULL,则数据页可以容纳更多行。因此,您的InnoDB缓冲区可能更有效。

但是,如果这在实践中提供了显着的性能优势,我将感到非常惊讶。担心NULL对性能的影响在于微优化领域。您应该将注意力集中在其他方面,这些领域可以带来更大的收益。例如,添加精心选择的索引或增加数据库缓存分配。

2020-05-17