我想知道是否有人在MySQL文档中发现确认对于InnoDB,在索引中允许NULL的列需要1个额外的字节?
示例:创建一个列SMALLINT UNSIGNED DEFAULT NULL;(2个字节).索引使用3个字节(不考虑PK链接).
同一列不允许NULL:SMALLINT UNSIGNED NOT NULL; 索引将是应该的 - 2个字节.
UPD:我在文档中发现了这一点:"由于密钥存储格式,对于可以为NULL的列而言,密钥长度比对于NOT NULL列更大." 但是,我仍然不明白,对于NULLable列,索引大小是否大于1个字节.
PS抱歉我的英文不好:)
有在几个缺陷key_len的EXPLAIN.
SMALLINT是NULL或NOT NULL.VAR... 实际上占用了不同的空间.key_len 通常占了与测试的任何柱(或多个)=.如果有也是一个"范围"测试(BETWEEN,>,LIKE 'foo%', etc)可以使用索引的一部分,key_len不指示这样.GROUP BY和ORDER BY.您可以使用获取更多信息(但仍然不是'每个')EXPLAIN FORMAT=JSON SELECT ....
从逻辑上讲,如果不是现实,那么NULL2字节就没有空间SMALLINT.因此,需要更多空间 - 至少一点.
有两个独立的问题 - 索引的大小BTree,以及查询期间使用的数据结构.
我认为额外的字节或位NULL不值得担心.相反,最好说NOT NULL除了你有"业务逻辑"要求NULL(没有值,N/A,尚未指定等).然后让表,索引等根据需要消耗额外的位或字节.
我认为(没有充分确认)InnoDB没有为空位占用额外的空间 - 它是每列前缀的8位或16位之一.
请注意,在InnoDB中,索引BTree与数据BTree基本相同.(这PRIMARY KEY是BTree数据的排序.)