为什么mongoengine没有引用ReferenceField创建索引

时间:2013-11-05 10:31:48

标签: python mongodb mongoengine

我认为MongoEngine中的ReferenceField也为这个字段创建了一个索引。由于MongoEngine从Django ORM样式继承了很多东西,并且它为其ForeignKeys创建了一个索引。我也希望这也会发生在这里。

示例,我有两个简单的文档定义:

import mongoengine as me

class Group(me.Document):
    name = me.StringField()
    meta = {'collection': 'groups'}

class Item(me.Document):
    name = me.StringField()
    group = me.ReferenceField(Group)

如果我在mongodb CLI中查找索引,那么ReferenceField没有索引:

> db.item.getIndexes()
[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "ns" : "me_tests.item",
        "name" : "_id_"
    }
]
> 

有没有理由不这样做?

我遇到了大约60000个项目的生产服务器的问题,对所有项目组进行查找需要大约234秒...但是当我索引ReferenceField时...我将该数字降低到~2s ..所以我猜性能论证很清楚。

1 个答案:

答案 0 :(得分:1)

MongoDB中没有连接,因此ReferenceField只是碰巧存储ObjectId的普通字段。

索引应该通过思考和计划来创建 - 拥有一个以及没有一个是成本。所以“什么是架构的最佳索引?”那真的只取决于一件事 - 用法

您如何使用数据?如何查询数据?这应该推动索引的设计,而不是你要存储的数据类型*

为了获得最佳性能,最好调整查询(就像您所做的那样) - 使用内置的profiling 是一个好的开始。

*与以往一样,有一个例外证明了规则 - 地理数据:)