【问题标题】:Why doesn't mongoengine ReferenceField create an index为什么mongoengine ReferenceField 不创建索引
【发布时间】:2013-11-05 18:54:12
【问题描述】:

我相信 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 秒。所以我想性能论点很清楚。

【问题讨论】:

    标签: python mongodb mongoengine


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-01
      • 2012-02-29
      相关资源
      最近更新 更多