0

私は、MongoEngine の ReferenceField もこのフィールドのインデックスを作成すると信じていました。MongoEngine は Django ORM スタイルから多くを継承しているため、ForeignKeys のインデックスを作成します。これがここでも発生することを期待していました。

たとえば、次の 2 つの単純なドキュメント定義があります。

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 秒かかりました..パフォーマンスの議論は非常に明確です。

4

1 に答える 1

1

MongoDB には結合がなく、そのため ReferenceField は ObjectId を格納する通常のフィールドにすぎません。

インデックスは、よく考えて計画を立てて作成する必要があります。インデックスを作成する場合も、作成しない場合もコストがかかります。では、「スキーマに最適なインデックスは?」まあ、それは本当に 1 つのことだけに依存します -使用法

データをどのように使用し、そのデータをどのように照会していますか? これにより、保存するデータの種類ではなく、インデックスの設計が促進されるはずです*

したがって、最高のパフォーマンスを得るには、クエリを調整するのが最善です (あなたが行ったように) - 組み込みのプロファイリングを使用するの が良いスタートです。

* いつものように、ルールを証明する例外があります - 地理データ:)

于 2013-11-05T10:54:12.997 に答える