2

我的 MySQL ( InnoDB ) 中有一个表,里面有用户项。基本上每一行都有一个 user_id 字段和其他项目属性,如颜色。然后还有一个称为链接的字段,它包含其他用户项目的 id,但在大多数情况下(90%)没有链接项目,因此该字段设置为NULL

我想知道创建一个包含链接信息的新表是否比将字段链接设置为600 万行中的90%更有效?NULL

我正在使用休眠。

4

4 回答 4

2

是的,这样会更有效率。这将产生非常小的差异。

最好的办法是做任何对你来说最容易的事情,然后当它成为一个真正的问题时改变它。

于 2011-06-21T19:03:43.180 回答
1

是的,它会更有效,更规范。每当我看到一个有很多这样的空值的表时,我认为它是规范化的候选者。在此示例中,您可以从表中完全删除该列,这样会更干净且更易于维护。您只需创建一个联结表,其中包含两个 user_id,它们是用户项目表上的外键。

于 2011-06-21T19:11:09.517 回答
0

它会占用更少的空间。但是,如果您为每个查询执行(左)JOIN,则性能会变得更糟.. 特别是如果您有很多行并且表不适合内存。然后你需要两次磁盘查找来获取一条记录。

更新

  • JOIN 需要一些额外的处理。如果您有索引,它会很快,但您仍然必须查找另一条记录。如果你使用 InnoDB 来支持事务,那么数据库必须为连接记录维护一个版本。
  • JOIN 对内存位置不利,现在您必须查找位于完全不同内存位置的记录。
  • 正如我所提到的,如果数据不在内存中,则需要额外的磁盘查找。这真的很糟糕。
于 2011-06-21T19:08:01.457 回答
0

就您的逻辑而言,只需考虑仅存储带有链接数据的表,并且调用 if 的代码可以执行“if not null”或等效于始终知道要获取的内容。如果您可以做出更好的假设,请不要存储所有这些空值

于 2011-06-21T19:04:57.707 回答