我需要对几百万个标题进行比较,以查看交集和区别。
数据看起来像这样:
Title Platform
Terminator 1
Terminator 2
Abyss 1
我想找出诸如“向我显示平台1上的所有标题,但不是2(”深渊“)”,“显示两个平台上的所有标题(”终结者“),显示的内容,显示me平台2上的所有标题,但不是平台1(NULL)。
我只有两个要比较的平台,1和2.我应该将所有数据存储在一个表中,还是将它存储在具有相同结构的两个单独的表中?哪个会提供更好的性能?
答案 0 :(得分:6)
如果那些是您必须回答的三个查询,并且您必须快速回答它们,那么我会建议较不规范化的路线:
(当然,如果每个平台都有其他信息,则可能性较小。)
每个标题有多行,您必须使用group by
或join
才能将数据放在一起以回答您的示例问题。将数据放在一行中,您可以使用索引查找轻松回答这些问题。
“缺点” - 如果是一个 - 是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美分:保持这种方式并通过索引检查优化可能性等。