规范化与性能:在(此)模式中删除链接表的好处/问题?

时间:2011-11-11 18:04:09

标签: mysql performance

一般来说,我希望尽可能保持数据库的清洁和可扩展性。

然而,在做了一些测试之后,我意识到尽管这通常是最好的方法,但在处理大型数据集时,它比我所说的“脏”方法更慢。

基本上可以说我有一个对象表。这些物品属于某些人。一个对象可能有一个人,而其他人超过1.我最初的想法就像我一直做的那样,为我的对象创建一个对象表,为我的人创建一个人员表,然后是一个object_to_people链接表。

但是,为了获取一个人被分配到的所有对象,加入对象和链接器表可能需要3秒钟(这基于大约400k记录,但每个对象只有1个链接)。是的我也建立了索引的e.c.t.试着加快速度。

如果我改为删除人员和链接器表,并将对象表中的人员作为列并使用1/0设置是否将每个人分配给该对象,而不加入两个大表我看到的速度为大约0.3 - > 0.7秒(变化很大)。

首先,我们只需要2个人。但如果我能帮助它,我不想过于严格。我知道我可以使用缓存以及什么不能改善最终用户的时间,但是有什么理由认为使用列而不是链接表是一个非常糟糕的主意吗?

4 个答案:

答案 0 :(得分:2)

我有类似的设置 我的连接表有17,000,000行。我的“人”表有8,400,000行,而我的“对象”表有300,000行。

我的连接表上有多个连接的查询和返回数万行的结果联合,运行时间不到1秒(50-400ms)。

我认为您的第一个布局可能没问题,但您可能需要关注索引和查询。

答案 1 :(得分:0)

  

但是有什么理由认为这是一个非常糟糕的主意   使用列而不是链接表?

如果您认为可扩展性超过您获得的性能,那么我认为这是一个非常糟糕的想法。

如果您重视获得的性能而不是可扩展性,我会说这是一个非常的想法。

答案 2 :(得分:0)

如果确实一个对象可以同时属于多个人...则保留链接表。

答案 3 :(得分:0)

同样在mysql alter table中,巨大的表可以执行非常长的时间,因此在合理的时间内无法在应用程序中添加新用户。