2012-11-22 39 views
0

我有经验的集合,它包含文件与下面的模式索引:我有太多索引吗?

{ 
    title: "Programming 101", 
    category: 1 
    likes: 10, 
    author: { 
     name: "Mike", 
     reputation: 100, 
     rating: 1500 
    }, 
    created: 154895126, // unix timestamp 
    content: ".... html ... " 
} 

在我的应用程序的索引页,我显示来自所有类别最新的18个教训,所以这是

db.lessons.find().sort({created:-1}).limit(18) 

由于这是一个非常普遍的查询和经验收集将是我系统中最大的收集,我想尽可能优化它,所以我做了一个索引创建

db.lessons.ensureIndex({created:-1}) 

但有时我想从一类

db.lessons.find({category:1}).sort({created:-1}).limit(18) 

所以我也加入类的指数,因为如果我不,蒙戈可以排序很容易,但它仍然有通过检查元素得到的只是教训因此,

db.lessons.ensureIndex({category:1}) 

因为我不按类别排序,我只是通过1,为升序。

现在,问题是我还想根据喜欢,作者的声望和作者的评价排序课,这些将是非常常见的任务,不像通过创建排序一样普通,但仍然很常见,如果我添加3个以上指数?或者只是使用创建的?

db.lessons.ensureIndex({likes:-1}) 
db.lessons.ensureIndex({'author.reputation':-1}) 
db.lessons.ensureIndex({'author.rating':-1}) 

我觉得我可能会使用太多的索引,并且内存中的集合大小可能会很大。

+2

有没有原因你的第二个索引不是{category:1,created:-1}?没有第二部分,排序必须发生在内存中,这种内存更密集且速度更慢。 –

+0

您是否还可以添加关于您将拥有多少文档(近似最大值)的信息以及您允许的排序将在整个结果集上还是仅在每个子类别中添加信息? –

回答

0

如果你提到

这些将是非常常见的任务

比在我看来,你应该使用索引,否则您的查询将通过所有的文件在您的收藏给前结果。当然,要更确切地回答一个问题,你必须知道你的收藏数量,当然还有一些关于“普通事物”的指标。当然,决定你应该如何表现的最好方法是运行一些测试。

收集用户在某段时间(2天内)行为的信息,并检查每种查询出现的次数。比你现在每个人的'共同性'。而不是模拟这些类型的查询有和没有索引,并检查什么更好。

而且还与我有关@Asya这里同意回复

是有一个原因,你的第二个指标是不是{类:1,创建:-1}

3

我会第三asya提出的综合指数动议。

> db.lessons.ensureIndex({category:1}); 
> db.lessons.ensureIndex({created:-1}); 
> db.lessons.find({category:1}).sort({created:-1}).limit(18).explain(); 
{ 
    "cursor" : "BtreeCursor category_1", 
    "nscanned" : 1, 
    "nscannedObjects" : 1, 
    "n" : 1, 
    "scanAndOrder" : true, 
    "millis" : 0, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "isMultiKey" : false, 
    "indexOnly" : false, 
    "indexBounds" : { 
     "category" : [ 
      [ 
       1, 
       1 
      ] 
     ] 
    } 
} 

这里解释()说明的MongoDB不会利用在我们所期望的SQL数据库将在两路单独的索引。

> db.lessons.ensureIndex({category:1,created:-1}); 
> db.lessons.find({category:1}).sort({created:-1}).limit(18).explain(); 
{ 
    "cursor" : "BtreeCursor category_1_created_-1", 
    "nscanned" : 1, 
    "nscannedObjects" : 1, 
    "n" : 1, 
    "millis" : 0, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "isMultiKey" : false, 
    "indexOnly" : false, 
    "indexBounds" : { 
     "category" : [ 
      [ 
       1, 
       1 
      ] 
     ], 
     "created" : [ 
      [ 
       { 
        "$maxElement" : 1 
       }, 
       { 
        "$minElement" : 1 
       } 
      ] 
     ] 
    } 
} 

综合指数看起来就像是肯定的赢家。

至于担心索引过多,对于我的日常工作,我正在处理一个拥有超过3800万个文档的集合,通过--notablescan选项禁用表扫描。我们发现,为每个查询量身定制索引对我们至关重要。