允许为空的innodb索引大小(mysql)

hrirmatl  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(254)

我想知道是否有人在mysql文档中发现过这样的确认:对于innodb,允许索引为null的列需要额外的1个字节?
示例:创建列 SMALLINT UNSIGNED DEFAULT NULL; (2字节)。索引使用3个字节(不考虑pk链接)。
不允许null的同一列: SMALLINT UNSIGNED NOT NULL ; 索引应该是-2字节。
upd:我在docs中发现了这样一个问题:“由于密钥存储格式的原因,可以为null的列的密钥长度比不为null的列的密钥长度大一个字节。”但是,我仍然不知道,对于可以为null的列,索引大小是不是大1字节。
p、 对不起,我的英语不好:)

yjghlzjz

yjghlzjz1#

这本书有几个缺点 key_lenEXPLAIN .
发动机之间存在差异,但解释没有考虑这些差异。
空位可能占用一个完整字节,也可能不占用一个完整字节。不过,3比2是一个方便的线索 SMALLINTNULL 或者 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` 是数据树的顺序。)

相关问题