【问题标题】:Mysql column with null values - what are the space requirements?具有空值的 Mysql 列 - 空间要求是什么?
【发布时间】:2010-12-20 16:56:33
【问题描述】:

我有一张包含很多条目的表格。 我需要一个带有整数值或空值的附加列。 问题是只有极少数行会填充该字段。

所以我想知道创建一个单独的表是否更好,我在其中以 1:1 关系链接条目。

我知道 mysql/myisam 中的一个整数条目需要 4 个字节。如果我将列设置为允许空值,并且 100 000 行中只有 100 行填充了该字段,其余的是否仍会为每个空值消耗 4 个字节?

或者 mysql 是否足够智能,可以在填充的地方设置值,并且在没有设置的地方将所有内容都视为 null?

【问题讨论】:

    标签: mysql null storage requirements


    【解决方案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

    【讨论】:

    • 怎么可能使用零空间来存储空值?如果无法记住这些值,则必须付出一些代价。
    • @nate c ...好吧只是存储数据,没有对应部分的每个数据都是隐式空
    • 该链接中没有任何内容说明如何存储空值。如果我存储 6 列整数,其中值为 33、44、66,则三列隐式为空。它们是哪 3 列?那是零存储。至少你需要一个位域来判断哪些列存在,哪些不存在。
    【解决方案2】:

    据我了解,一旦将字段声明为 int,就会为其预留 4 个字节。因此,对于 100,000 行,您正在查看大约 400 KB 的空间。

    如果空间是一个约束,那么单独的表会更好。另一方面,如果性能是一个标准,那么您必须考虑查询该字段的次数以及是否检查它是否存在。无论哪种情况,您都需要加入。如果要检查字段是否设置,可以使用内连接,这会比单表查询慢。如果要检查不存在,则需要左/右外连接,这将比内连接慢。

    【讨论】:

      【解决方案3】:

      它将使用位域来存储空值,因此它可能需要不到一个字节。但是,即使它确实如此 - 谁在乎,除非您使用 3.5" 软盘将后端存储在 ;-)

      NULL in MySQL (Performance & Storage)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-11
        • 1970-01-01
        相关资源
        最近更新 更多