MySQL - 1个包含100列的大表或分为5个表和JOIN

时间:2011-03-09 12:10:07

标签: mysql optimization join

我有一个'大'的MySQL表,最初包含~100列,最后我把它分成5个单独的表,然后用CodeIgniter Active Record加入它们......

从性能的角度来看,最好将原始表保留100列或保持分裂。

每张桌子大约有200行。

4 个答案:

答案 0 :(得分:2)

200行?那没什么。

如果新表以对您的问题有意义的方式组合列,我会拆分表。我会着眼于normalization

你听起来像是在分裂它们以满足一些未经陈述的“善意”标准,或者因为你当前的表现是不可接受的。您是否有一些数据表明您的架构导致性能问题?如果没有,我建议重新考虑这种方法。

没有人能说出对性能的影响。查询时,更多JOIN可能会更慢,但您没有说明您的用例是什么。

答案 1 :(得分:1)

所以你已经做了改变,现在你问我们是否知道你的架构的哪个版本更快?

(如果答案是拆分表,那么你做错了什么。)

合并表不仅应该更快,而且还需要更少的代码,因此不太可能出现错误。

您没有提供有关数据结构的任何信息。

在数据库中有200行,性能是你需要担心的最后一件事。

答案 2 :(得分:0)

重要的是 - 您可以(以及它的好样式!)将包含临时数据的列移动到单独的表中。您可以将可选列移动到单独的表中(这取决于逻辑)。

当你创建一个数据库时,最重要的是:每个表都应该包含一些本质。您应该更好地创建更多表,但将不同的本质分成不同的表。唯一的例外是您必须优化软件,因为“直接”逻辑解决方案运行缓慢。

如果你处理一些非常复杂的模型,你应该把它分成几个简单的关系简单的块 - 这也适用于数据库设计。

至于性能 - 当然,一个表应该提供更好的性能,因为您不需要任何类型的连接和密钥来访问所有数据。减少关系 - 减少滞后。

答案 3 :(得分:0)

您所指的概念称为垂直分区,它可能会对性能产生惊人的影响。在Mysql.com Performance Post他们特别讨论这个问题。摘自文章:

  

虽然你必须做垂直   手动分区,你可以受益   从某种做法来看   情况。例如,让我们说   你通常不需要参考   或使用中定义的VARCHAR列   我们之前显示的分区   表