MongoDB 查询 64 位整数字段时 find() 很慢
MongoDB find() slow when querying a 64-bit integer field
我有一个名为 Elements 的 Mongo 集合,其中包含约 900 万个文档。每个文档具有以下结构:
{
_id : "1",
Timestamp : Numberlong(12345),
Nationality : "ITA",
Value: 5
}
如果我运行下面的查询:
db.Elements.find({ Nationality: 'ITA' })
查询执行速度很快(几毫秒)。
如果我 运行 以下查询:
db.Elements.find({ Timestamp: 12345 })
查询速度慢,几十秒量级。显然,如果我在 Timestamp
上添加索引,查询 运行 就会快得多。 运行 Int32 类型字段 Value
上的相同查询,与第一个查询一样快 运行s。
我想了解的是:为什么第二个查询(没有索引)的性能比第一个差得多? Mongo 对 Int64 值的处理方式是否与其他值不同?
原来是我搞错了
我正在使用 Robomongo 来执行查询;默认情况下,Robomongo 对结果进行分页(默认页面大小为 50 项)。
因为 Timestamp
字段包含几乎总是不同的值,所以查询必须执行几乎完整的扫描才能填满和 return 一页。另一方面,因为其他字段包含的值的范围有限(Value
字段,虽然它是 Int32,但在我的应用程序中有一个有限的域)我很快就得到了结果,因为我只看第一页。
当我 运行 没有页面的相同查询(例如通过附加 count
或获取执行计划)时,所有查询在没有索引的情况下性能不佳。
因此,与其他原始类型相比,似乎没有对 Int64 值进行任何特殊处理。
我有一个名为 Elements 的 Mongo 集合,其中包含约 900 万个文档。每个文档具有以下结构:
{
_id : "1",
Timestamp : Numberlong(12345),
Nationality : "ITA",
Value: 5
}
如果我运行下面的查询:
db.Elements.find({ Nationality: 'ITA' })
查询执行速度很快(几毫秒)。
如果我 运行 以下查询:
db.Elements.find({ Timestamp: 12345 })
查询速度慢,几十秒量级。显然,如果我在 Timestamp
上添加索引,查询 运行 就会快得多。 运行 Int32 类型字段 Value
上的相同查询,与第一个查询一样快 运行s。
我想了解的是:为什么第二个查询(没有索引)的性能比第一个差得多? Mongo 对 Int64 值的处理方式是否与其他值不同?
原来是我搞错了
我正在使用 Robomongo 来执行查询;默认情况下,Robomongo 对结果进行分页(默认页面大小为 50 项)。
因为 Timestamp
字段包含几乎总是不同的值,所以查询必须执行几乎完整的扫描才能填满和 return 一页。另一方面,因为其他字段包含的值的范围有限(Value
字段,虽然它是 Int32,但在我的应用程序中有一个有限的域)我很快就得到了结果,因为我只看第一页。
当我 运行 没有页面的相同查询(例如通过附加 count
或获取执行计划)时,所有查询在没有索引的情况下性能不佳。
因此,与其他原始类型相比,似乎没有对 Int64 值进行任何特殊处理。