MongoDB简单的geoWithin查询在3M文档上需要10分钟

时间:2014-11-20 22:10:20

标签: mongodb

我有一个包含两个推文的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,看起来它会更快,但还没有实数。

1 个答案:

答案 0 :(得分:0)

所以,我回答了我的问题,尽管我还不知道为什么它会变慢。但我知道真正的问题的答案,这是"我现在该怎么办?"

答案是,迁移到Postgres / PostGIS。

做了一些基准测试:http://ilessendata.blogspot.com/2015/04/mongodb-vs-postgresql-for-geo-queries.html如果你想了解更多,但简而言之,它看起来像geo"在这个框中找到所有内容" Postgres上的查询速度提高了1-2个数量级(如果你按坐标索引和聚类)。

祝你好运,未来的StackOverflowers偶然发现了这种挫败感。