1

我们有一个 mongo 集合,可以在许多领域进行搜索和排序。举个例子(对不起,由于保密,我不能放真正的收藏),我们采取:

MathProblem
{
    Creator : String,
    Difficulty : integer (from 0 to 4),
    Categorie : integer (from 0 to 40),
    NbOfQuestion : integer (less than 20),
    Likes : integer,
    Dislikes : integer,
    Succeeded : integer,
    Failures : integer
}

我们可以搜索 Creator、Difficulty、Categorie、NbOfQuestion。并按喜欢、不喜欢、成功和失败进行排序。

前任:

  • 给我难度 3 的问题,类别 20 按点赞数排序。
  • 给我 5 个问题的问题,按失败排序。
  • 给我难度为 1、类别 10、2 的问题,由 Einstein 创建。
  • 给我所有按成功排序的问题。

等等......你得到的图片所有的排列都是可能的,我们可以选择在一个字段上排序。

这里的问题是我们有数百万条记录。索引花费我们至少 30 gig。另外,因为我们有这么多的索引,它压低了这个集合的写入速度。虽然它正在破坏写作,但它正在锁定阅读。所以我们读了很多,写的可能少了一点,但仍然很多。

我搜索“搜索引擎解决方案”,但我只能在“全文搜索”上找到东西,这不是我的情况。

我们还尝试将难度、Categorie 和 NbOfQuestion 合并到一个数组中(通过将值乘以 10 因子以保持它们之间的一致性)以仅在该数组上建立索引并节省一些空间。

任何事后诸葛亮将不胜感激!

谢谢,

查尔斯

4

1 回答 1

0

查尔斯,

您的问题没有简单的解决方案。目前最好的解决方案可能是使用 MongoDB 的分片功能向外扩展。http://www.mongodb.org/display/DOCS/Sharding+Introduction

这里的目的是将您的工作集拆分到多台机器上,以减少一次写入会“粉碎”的数据量。此外,我可以建议升级到至少 MongoDB v 2.0.7,因为 2.X 分支中有许多新功能(例如 yield-on-long-operation 和 yield-on-page-fault),旨在减少写锁对系统的影响。有关 MongoDB 并发的更多信息,请参见http://www.mongodb.org/display/DOCS/How+does+concurrency+work

干杯,

大卫

于 2012-08-23T18:50:00.613 回答