2016-04-15 77 views
0

我有一个名为Elements的Mongo集合,它包含了〜900万个文档。每个文档的结构如下:当查询64位整数字段时MongoDB find()变慢

{ 
    _id : "1", 
    Timestamp : Numberlong(12345), 
    Nationality : "ITA", 
    Value: 5 
} 

如果我运行下面的查询:

db.Elements.find({ Nationality: 'ITA' }) 

查询执行快速(几毫秒)。

相反,如果我运行下面的查询:

db.Elements.find({ Timestamp: 12345 }) 

查询速度慢,在几十秒的量级。很显然,如果我在Timestamp上添加索引,查询运行得更快。在字段Value(Int32类型)上运行相同的查询,运行速度与第一个查询一样快。

我想了解的是:为什么第二个查询(没有索引)的性能比第一个要差得多? Mongo是否将Int64值视为与其他值不同?

+0

另请为这两种类型的整数包括'explain(“executionStats”)'。有和没有索引 – Saleem

+0

谢谢@JohnnyHK的建议。我刚刚做到了。 –

回答

1

事实证明我犯了一个错误。

我正在使用Robomongo执行查询;默认情况下,Robomongo页面结果(默认页面大小为50项)。

因为Timestamp字段包含的值几乎总是不同的,所以查询在填充并返回一页之前必须执行几乎完整的扫描。另一方面,由于其他字段包含的值有限(Value字段,尽管它是Int32,在我的应用程序中有一个有限的域),所以我很快获得了结果,因为我只查看第一页。

当我运行没有页面的相同查询时(例如通过附加count或获得执行计划),所有查询的性能都很差,没有索引。

因此,对于其他基本类型,似乎没有任何特殊的Int64值处理。