允许NULL的InnoDB索引大小(MySQL)

1 mysql innodb

我想知道是否有人在MySQL文档中发现确认对于InnoDB,在索引中允许NULL的列需要1个额外的字节?

示例:创建一个列SMALLINT UNSIGNED DEFAULT NULL;(2个字节).索引使用3个字节(不考虑PK链接).

同一列不允许NULL:SMALLINT UNSIGNED NOT NULL; 索引将是应该的 - 2个字节.

UPD:我在文档中发现了这一点:"由于密钥存储格式,对于可以为NULL的列而言,密钥长度比对于NOT NULL列更大." 但是,我仍然不明白,对于NULLable列,索引大小是否大于1个字节.

PS抱歉我的英文不好:)

Ric*_*mes 5

有在几个缺陷key_lenEXPLAIN.

  • Engines之间存在差异,但Explain没有考虑到这一点.
  • 空位可能会也可能不会占用整个字节.仍然,3对2是一个方便的线索,SMALLINTNULLNOT NULL.
  • VAR... 实际上占用了不同的空间.
  • InnoDB`每列有一个1或2个字节的前缀; 没有提到.
  • key_len 通常占了与测试的任何柱(或多个)=.如果有也是一个"范围"测试(BETWEEN,>,LIKE 'foo%', etc)可以使用索引的一部分,key_len不指示这样.
  • 同上使用索引的一部分GROUP BYORDER BY.

您可以使用获取更多信息(但仍然不是'每个')EXPLAIN FORMAT=JSON SELECT ....

从逻辑上讲,如果不是现实,那么NULL2字节就没有空间SMALLINT.因此,需要更多空间 - 至少一点.

有两个独立的问题 - 索引的大小BTree,以及查询期间使用的数据结构.

我认为额外的字节或位NULL不值得担心.相反,最好说NOT NULL除了你有"业务逻辑"要求NULL(没有值,N/A,尚未指定等).然后让表,索引等根据需要消耗额外的位或字节.

我认为(没有充分确认)InnoDB没有为空位占用额外的空间 - 它是每列前缀的8位或16位之一.

请注意,在InnoDB中,索引BTree与数据BTree基本相同.(这PRIMARY KEY是BTree数据的排序.)