性能更高 - 两张桌子或一张桌子

时间:2014-01-24 23:18:37

标签: mysql sql

我需要对几百万个标题进行比较,以查看交集和区别。

数据看起来像这样:

Title        Platform
Terminator    1
Terminator    2
Abyss         1

我想找出诸如“向我显示平台1上的所有标题,但不是2(”深渊“)”,“显示两个平台上的所有标题(”终结者“),显示的内容,显示me平台2上的所有标题,但不是平台1(NULL)。

我只有两个要比较的平台,1和2.我应该将所有数据存储在一个表中,还是将它存储在具有相同结构的两个单独的表中?哪个会提供更好的性能?

2 个答案:

答案 0 :(得分:6)

如果那些是您必须回答的三个查询,并且您必须快速回答它们,那么我会建议较不规范化的路线:

  • 标题
  • IsPlatform1
  • IsPlatform2

(当然,如果每个平台都有其他信息,则可能性较小。)

每个标题有多行,您必须使用group byjoin才能将数据放在一起以回答您的示例问题。将数据放在一行中,您可以使用索引查找轻松回答这些问题。

“缺点” - 如果是一个 - 是insert的操作现在是update。实际上,MySQL具有非常方便的insert . . . on duplicate key update语法来很好地处理这种情况。

如果您的数据结构实际上比问题复杂得多,那么这可能是不可行的。除非有充分的理由,否则我对非规范化的态度基本上是为了保持数据的正常化。假设需要针对它们优化性能,您的三个示例查询提供了一个很好的理由。

答案 1 :(得分:0)

我认为这主要取决于索引的有效使用和正确的查询。除非涉及到大量数据,否则划分表格或using partitions to divide table data只是一个不错的解决方案。

当(非常)大行或历史数据导致内存缓存问题时,分割或分区很有用。您可以自己计算:1百万行1 KB需要1 GB内存来加载整个表。如果你使用索引,数据库必须阅读'只是' 100行,需要100 KB。

我的2美分:保持这种方式并通过索引检查优化可能性等。