哪个更快:在大型非规范化表上查找或在三个较小的表之间进行连接?

时间:2014-01-17 17:21:20

标签: mysql sql database performance join

我有一个非规范化的表,里面有100,000条记录。我可以将其归一化为一个少于50条记录的表,以及上述表与另一组10000条记录之间的20000条记录的多对多记录。在100,000条记录中查找或将10000条记录中的一条记录加入到多对多关系中是否更快?引文非常受欢迎,因为我不相信我可以测试这两个条件。

2 个答案:

答案 0 :(得分:6)

通常,如果适当的索引到位,则对于select语句,非规范化表将更快,但是在某些情况下,非规范化表将表现更差。 它取决于相对行宽。如果您将占用大部分非规范化表的行宽的列分解出来,并且生成的表的行数要小得多,那么由于更好的缓存,规范化结构可能会更快(表的内存占用量会小得多) )。

在你的情况下,你应该知道100K记录是一个非常小的数据库,你可能 不应该让绩效成为改变背后的驱动因素。除了表现之外,规范化还有很多好处。

答案 1 :(得分:2)

我完全取决于具体情况。结果集有多大?您是否在查询所需的列上有覆盖索引?

非规范化模型的“优势”是所有列都在一个地方;缺点很多,但从性能的角度来看,这意味着您拥有宽行,因此每页的行数更少。这意味着查询必须从磁盘中获取更多页面才能找到所需内容。

通常,正确标准化的数据模型(例如第3范式)将表现得相当好。是的,您的查询会更复杂,但它为表带来的是窄行(每页更多行,意味着给定查询的读取次数更少)。此外,查询将使用的连接条件更可能具有覆盖索引,这意味着连接可能表现良好。

但不知道细节,不可能说。找出答案的唯一方法是检查特定查询的查询计划。

对数据进行非规范化非常容易。归一化数据要困难得多,因为所有重复的重复数据都可能存在......需要解决的差异。获取您的数据模型正确:应用程序是暂时的,但[好]数据将永远持续/

在出现问题之前进行非规范化是一种过早优化的情况。