0

我相信 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 时。我将这个数字降低到约 2 秒。所以我猜性能论点很清楚。

4

1 回答 1

1

MongoDB 中没有连接,因此 ReferenceField 只是一个恰好存储 ObjectId 的普通字段。

索引的创建应该经过深思熟虑和计划——拥有一个和没有一个都需要付出代价。那么“架构的最佳索引是什么?” 嗯,这真的只取决于一件事——用法

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

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

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

于 2013-11-05T10:54:12.997 回答