python - mongodb 按照距离排序查询很慢
PHP中文网
PHP中文网 2017-04-17 18:01:47
0
3
605

类似于lbs的服务,需要按照用户位置的距离排序。

集合的结构:

{
    "_id" : ObjectId("574bbae4d009b5364abaebe5"),
    "cityid" : 406,
    "location" : {
        "type" : "Point",
        "coordinates" : [
            118.602355,
            24.89083
        ]
    },
    "shopid" : "a"
}

差不多5万条数据。

索引:

[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "pingan-test.shop_actinfo_collection_0530"
    },
    {
        "v" : 1,
        "key" : {
            "location" : "2dsphere"
        },
        "name" : "location_2dsphere",
        "ns" : "pingan-test.shop_actinfo_collection_0530",
        "2dsphereIndexVersion" : 3
    },
    {
        "v" : 1,
        "key" : {
            "shopid" : 1,
            "cityid" : 1
        },
        "name" : "shopid_1_cityid_1",
        "ns" : "pingan-test.shop_actinfo_collection_0530"
    }
]

查询的条件是:

{'cityid': 2, 'location': {'$near': {'$geometry': {'type': 'Point', 'coordinates': [122.0, 31.0]}}}, 'shopid': {'$in': ['a','b']}}

当使用pymongo查询的时候,迭代会消耗大概300ms的时间,这个难以接受。

results = collection.find(body, {'shopid': 1, '_id':0},).batch_size(20).limit(20)
shops = list(results)

第一步获取一个游标,几乎没有消耗时间;
第二部对这个有标进行迭代消耗300~400ms时间。

应该如何优化?

PHP中文网
PHP中文网

认证0级讲师

répondre à tous(3)
黄舟

Enfin, je viens de créer un index cityid: 1, shopid: 1, "location" : "2dsphere"
Après cela, le monde était à nouveau en paix.

小葫芦

Construire un index de cette manière peut certainement résoudre le problème, mais je voudrais ici souligner un point qui est souvent négligé : Mettez d'abord des conditions de filtrage fortes
Parce que je ne sais pas comment vos données sont distribuées, je ne peux donc pas juger. Votre index répond-il à cette bonne pratique ? Mais il semble qu'à moins que shopid soit répété dans différentes villes (ce qui, je suppose, n'est généralement pas conçu de cette façon), cityid n'a aucun effet et n'a pas besoin d'être placé dans l'index, ce qui ne fait qu'augmenter la pression d'écriture.

黄舟

Utilisez expliquer dans le shell mongo pour analyser SQL et créer un index basé sur l'analyse. En même temps, vous devez prendre en compte le principe de la correspondance des préfixes les plus à gauche

.
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal