cari

Rumah  >  Soal Jawab  >  teks badan

python - mongodb 按照距离排序查询很慢

类似于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中文网2889 hari yang lalu608

membalas semua(3)saya akan balas

  • 黄舟

    黄舟2017-04-17 18:03:47

    Akhirnya, saya baru sahaja mencipta indeks cityid: 1, shopid: 1, "location" : "2dsphere"
    Selepas itu, dunia kembali aman.

    balas
    0
  • 高洛峰

    高洛峰2017-04-17 18:03:47

    Membina indeks dengan cara ini sudah tentu dapat menyelesaikan masalah, tetapi di sini saya ingin menekankan satu perkara yang sering diabaikan: Utamakan syarat penapisan yang kuat
    Kerana saya tidak tahu caranya data anda diedarkan, jadi saya tidak boleh menilai Adakah indeks anda memenuhi amalan terbaik ini? Tetapi nampaknya melainkan shopid diulang di bandar yang berbeza (yang saya syak biasanya tidak direka bentuk seperti ini), cityid tidak mempunyai kesan sama sekali dan tidak perlu diletakkan dalam indeks, yang hanya meningkatkan tekanan tulisan.

    balas
    0
  • 黄舟

    黄舟2017-04-17 18:03:47

    Gunakan explain dalam cangkerang mongo untuk menghuraikan SQL, dan bina indeks berdasarkan penghuraian Pada masa yang sama, anda perlu mempertimbangkan prinsip padanan awalan paling kiri

    balas
    0
  • Batalbalas