我认为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 ..所以我猜性能论证很清楚。
答案 0 :(得分:1)
MongoDB中没有连接,因此ReferenceField只是碰巧存储ObjectId的普通字段。
索引应该通过思考和计划来创建 - 拥有一个以及没有一个是成本。所以“什么是架构的最佳索引?”那真的只取决于一件事 - 用法。
您如何使用数据?如何查询数据?这应该推动索引的设计,而不是你要存储的数据类型*
为了获得最佳性能,最好调整查询(就像您所做的那样) - 使用内置的profiling 是一个好的开始。
*与以往一样,有一个例外证明了规则 - 地理数据:)