Maison > Questions et réponses > le corps du texte
类似于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时间。
应该如何优化?
黄舟2017-04-17 18:03:47
Enfin, je viens de créer un index cityid: 1, shopid: 1, "location" : "2dsphere"
Après cela, le monde était à nouveau en paix.
高洛峰2017-04-17 18:03:47
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.
黄舟2017-04-17 18:03:47
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
.