我的桌子上有很多条目。 我需要一个带整数值或null的附加列。 问题是只有很少的行会填充该字段。
所以我想知道创建一个单独的表是否更好,我以1:1的关系链接条目。
我知道一个整数条目在mysql / myisam中需要4个字节。如果我将列设置为允许空值,并且只有100个行中的100个已填充该字段,那么其余的仍会为每个空值消耗4个字节吗?
或者mysql是否足够聪明,可以设置填充的值,只是将所有内容视为null,没有设置任何内容?
答案 0 :(得分:1)
这取决于您在创建表时给出的ROW_FORMAT值。
在5.0.3版之前,默认格式设置为“REDUNDANT”:任何固定长度字段将使用相同的空格,即使它的值为NULL。
从版本5.0.3开始,该值设置为“COMPACT”:NULL值永远不会使用数据库中的任何空格。
您可以执行ALTER TABLE以确保使用正确的格式:
ALTER TABLE ... ROW_FORMAT=COMPACT
此处有更多详情: http://dev.mysql.com/doc/refman/5.1/en/data-size.html
答案 1 :(得分:0)
据我所知,一旦你将一个字段声明为int,就会为它预留4个字节。因此,对于100,000行,您正在寻找~400 KB的空间。
如果space是约束,那么单独的表会更好。另一方面,如果性能是一个标准,那么您将不得不考虑该字段被查询的次数以及是否检查其存在与否。在任何一种情况下,您都需要加入。如果要检查字段是否已设置,则可以使用内部联接,这将比单个表查询慢。如果要检查是否存在,则需要左/右外连接,这将比内连接慢。
答案 2 :(得分:0)
它将使用位域存储空值,因此它可能需要少于一个字节。但是,即使它确实 - 谁在乎,除非你使用3.5英寸的软盘来存储你的后端; - )