在Mongo中规范化只是为了减小文件大小/提高性能?

时间:2015-03-11 21:44:36

标签: performance mongodb

使用MongoDB,我很清楚规范化何时有意义,但我试图从数据大小或查询性能的意义上理解它是否有意义。

举个例子,假设我列出了2,000家零售店。例如,我不关心其他任何事情,所以我只有商店名称。至少几个字符但不超过一百个。

我有2000万人去商店旅行的记录。我会记录一些关于这次旅行的信息,以及这个商店名称。

在MySQL中,表/记录的文件大小会严重影响查询性能。规范化商店名称,以便我可以存储一次字符串,然后写入密钥(一个int),而不是节省大量的磁盘空间。这会变成性能提升。

在MongoDB中,这种类型的数据很小且不够重要,应该简单地嵌入。但是,我担心在2000万条记录之后,由于存在多少冗余数据,查询和/或文件大小会出现性能问题。

如果有500万人都去了一家商店,那么在mongo文件中将会有500万个该字符串的嵌入式副本。这将占用更多的磁盘空间,似乎它可能会超过整数的性能。

我想如果我对数据进行了规范化,Mongo仍然会有一些性能开销来查询其他数据。

2 个答案:

答案 0 :(得分:1)

  

如果有500万人都去了一家商店,那么在mongo文件中将会有500万个该字符串的嵌入式副本。

是的,更糟糕​​的是,如果名称​​更改,您必须更新5M条目

  

这将占用更多的磁盘空间,似乎它可能会超过整数的性能。

我禁止将整数作为键。如果排序(序列发生器成为瓶颈),整数会产生瓶颈,如果使用像HiLo这样的算法,则整数会产生非单调的瓶颈。使用ObjectId或其他非连续但非单调的内容。

Monotony通常会改善数据的位置(如果创建时间是一个地方标准,通常是这样),并有助于更有效地利用BTree。

  

我有2000万人去商店旅行的记录。我会记录一些有关旅行的信息以及这个商店名称。

这是一个典型的图形问题。人和商店是节点,旅行是边缘。 MongoDB handles normalized graphs better than one might think

直接比较两种方法的性能很棘手 - 额外的往返会使规范化查询变慢,但您可以选择另外存储每次旅行的商店名称。性能开销不会很大,但会增加内存压力。

总结一下,调整数据结构以减少查询肯定是有价值的,但是对于从平均80字节到24字节的绝对大小减少,我不会这样做。标准化结构更容易保持一致(或最终一致,当存储两者时),易于查询并且可以有效地加入'使用$in。好处是明确的数据所有权和更大的灵活性(例如,将查询转移到曾经去过x')的人更容易。

答案 1 :(得分:0)

规范化的问题取决于您在95%的时间内访问数据的方式。 例如如果您有一个首先列出商店的网站或应用程序 然后根据请求显示到商店的旅行然后肯定正常化

为集合中的Store属性添加索引可以提高搜索的性能,无论其是否为int

假设你已经这样做了,从我所看到的文档大小不会影响文档的搜索,因为它将使用索引来查找带有引用的存储的行