我有一个包含两个推文的MongoDB,一个在匹兹堡(tweet_pgh
),~3条推文,一个在克利夫兰(tweet_cleveland
),约有160条推文。在每个城市,我一直在尝试运行一个小的$ geoWithin查询,如下所示:
db.tweet_cleveland.find({coordinates: {$geoWithin: {$geometry:
{type : "Polygon", coordinates : [ [ [ -81.6826, 41.5041 ], [ -81.6726, 41.5041 ], [ -81.6726, 41.4941 ], [ -81.6826, 41.5041 ] ] ] }}
}}).explain()
没问题。完成251ms,扫描13k文件,返回~2k文件。
{
"cursor" : "S2Cursor",
"isMultiKey" : true,
"n" : 2070,
"nscannedObjects" : 2070,
"nscanned" : 13874,
"nscannedObjectsAllPlans" : 2070,
"nscannedAllPlans" : 13874,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 4,
"nChunkSkips" : 0,
"millis" : 251,
"indexBounds" : {
},
"nscanned" : 13874,
"matchTested" : NumberLong(11804),
"geoTested" : NumberLong(11804),
"cellsInCover" : NumberLong(2),
"server" : ...
}
所以我尝试在匹兹堡做同样的事情,它的推文数量是推文数量的20倍,并假设它需要大约20倍,所以5000毫秒。
db.tweet_pgh.find({coordinates: {$geoWithin: {$geometry:
{type : "Polygon", coordinates : [ [ [ -79.940, 40.466 ], [ -79.940, 40.465 ], [ -79.943, 40.465 ], [ -79.940, 40.466 ] ] ] }}
}}).explain()
但大约需要10分钟。 (2000倍。)
{
"cursor" : "S2Cursor",
"isMultiKey" : true,
"n" : 2129,
"nscannedObjects" : 2129,
"nscanned" : 284093,
"nscannedObjectsAllPlans" : 2129,
"nscannedAllPlans" : 284093,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 3,
"nChunkSkips" : 0,
"millis" : 586680,
"indexBounds" : {
},
"nscanned" : 284093,
"matchTested" : NumberLong(281964),
"geoTested" : NumberLong(281964),
"cellsInCover" : NumberLong(1),
"server": ...
}
我检查过的东西:索引(它们都有一个2dsphere索引,正在两者中使用。(光标显示“S2Cursor”)。RAM(不是问题,~3gb免费)。另一个类似的集合(tweet_sf) ,有大约2M的推文,和tweet_pgh一样慢。。类似大小的查询(大小和返回的记录数)
任何想法为什么这么慢? geoWithin或2dsphere索引是否存在二次或更糟的情况? 谢谢!
编辑:在愚弄它一段时间之后,我能说的最好的是这只是一个非常耗时的操作。没有什么我显然做错了,只是这很难。我现在正试图迁移到PostgreSQL + PostGIS,看起来它会更快,但还没有实数。
答案 0 :(得分:0)
所以,我回答了我的问题,尽管我还不知道为什么它会变慢。但我知道真正的问题的答案,这是"我现在该怎么办?"
答案是,迁移到Postgres / PostGIS。
做了一些基准测试:http://ilessendata.blogspot.com/2015/04/mongodb-vs-postgresql-for-geo-queries.html如果你想了解更多,但简而言之,它看起来像geo"在这个框中找到所有内容" Postgres上的查询速度提高了1-2个数量级(如果你按坐标索引和聚类)。
祝你好运,未来的StackOverflowers偶然发现了这种挫败感。