更高性能--两个表还是一个表

3

我需要比较几百万个标题,看到它们之间的交集和差异。

数据长这样:

Title        Platform
Terminator    1
Terminator    2
Abyss         1

我想找出像“展示所有在平台1上但不在平台2上的标题(“深渊”)”,“展示所有在两个平台上的标题(“终结者”)”,“展示所有在平台2上但不在平台1上的标题(NULL)”等信息。我只需要比较两个平台,1和2。我应该把所有数据存储在一个表中,还是分别存储在两个具有相同结构的表中?哪种方法可以提供更好的性能?

我只有两个平台可以比较 - 这是永久的吗?还是以后可以更改? - Karoly Horvath
这将是永久性的。只有两个平台。 - David542
2个回答

6
如果这三个查询是您必须快速回答的问题,那么我建议采用较少规范化的方法:
- 标题 - 是否为平台1 - 是否为平台2
(当然,如果每个平台有附加信息,则此方法可能不太可行。)
每个标题有多行数据,您需要使用group by或join将数据合并以回答示例问题。 如果数据在一行中,则可以使用索引查找轻松回答这些问题。
“缺点”是,现在进行插入操作会变成更新操作。 实际上,MySQL具有非常方便的insert . . . on duplicate key update语法,可以很好地处理这种情况。
如果您的数据结构比问题中的复杂得多,则可能无法采用此方法。 我对非规范化的态度基本上是保持数据规范化,除非有充分的理由。 假设需要针对性能进行优化,则您的三个示例查询提供了充分的理由。

0

我认为这主要取决于索引的有效使用和正确的查询。将表分割或使用分区来划分表数据,只有在涉及大量数据时才是一个不错的解决方案。

当存在(非常)大的行或历史数据时,分割或分区是有用的,因为会导致内存缓存问题。您可以自己计算:100万行1 KB需要1 GB的内存来加载整个表。如果使用索引,数据库只需读取“仅”100行,则需要100 KB。

我的建议是保持现状,并通过索引等方式寻找优化可能性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接