我想知道是否有人在mysql文档中发现过这样的确认:对于innodb,允许索引为null的列需要额外的1个字节?
示例:创建列 SMALLINT UNSIGNED DEFAULT NULL;
(2字节)。索引使用3个字节(不考虑pk链接)。
不允许null的同一列: SMALLINT UNSIGNED NOT NULL
; 索引应该是-2字节。
upd:我在docs中发现了这样一个问题:“由于密钥存储格式的原因,可以为null的列的密钥长度比不为null的列的密钥长度大一个字节。”但是,我仍然不知道,对于可以为null的列,索引大小是不是大1字节。
p、 对不起,我的英语不好:)
1条答案
按热度按时间yjghlzjz1#
这本书有几个缺点
key_len
的EXPLAIN
.发动机之间存在差异,但解释没有考虑这些差异。
空位可能占用一个完整字节,也可能不占用一个完整字节。不过,3比2是一个方便的线索
SMALLINT
是NULL
或者NOT NULL
.VAR...
实际上占用的空间是可变的。innodb
每列有一个1或2字节的前缀;没有提到这一点。 这个
key_len通常说明使用
=. 如果还有“范围”测试(
BETWEEN,
>,
LIKE 'foo%', etc)表示可以使用部分索引,key_len不表示这样。 使用部分索引
GROUP BY以及
ORDER BY. 你可以通过使用
EXPLAIN FORMAT=JSON SELECT .... 从逻辑上讲,如果不是在现实中,那就没有空间了
NULL在2字节中
SMALLINT. 所以,需要更多的空间——至少一点。 有两个独立的问题——索引btree的大小和查询期间使用的数据结构。 我认为
NULL不值得担心。相反,最好说
NOT NULL除非您对
NULL(无值、不适用、尚未指定等)。然后让表、索引等根据需要消耗额外的位或字节。 我认为(没有充分的确认)innodb没有为空位占用额外的空间——它是每列前面的8或16位之一。 注意,在innodb中,索引btree与数据btree基本相同(以及
PRIMARY KEY` 是数据树的顺序。)