gpt4 book ai didi

MongoDB - 查询超过 1000 万条记录的性能

转载 作者:可可西里 更新时间:2023-11-01 09:08:56 27 4
gpt4 key购买 nike

首先:我已经看了很多关于MongoDB查询性能的帖子,但是我没有找到好的解决方案。

在集合内部,文档结构如下所示:

{
"_id" : ObjectId("535c4f1984af556ae798d629"),
"point" : [
-4.372925494081455,
41.367710205649544
],
"location" : [
{
"x" : -7.87297955453618,
"y" : 73.3680160842939
},
{
"x" : -5.87287143362673,
"y" : 73.3674043270052
}
],
"timestamp" : NumberLong("1781389600000")
}

我的收藏已经有了一个索引:

db.collection.ensureIndex({timestamp:-1})

查询看起来像:

db.collection.find({ "timestamp" : { "$gte" : 1380520800000 , "$lte" : 1380546000000}})

尽管如此,响应时间还是太长了,大约 20 - 30 秒(这个时间取决于指定的查询参数)

任何帮助都是有用的!

提前致谢。

编辑:我更改了查找参数,将其替换为真实数据。

上面的查询耗时46秒,这是explain()函数给出的信息:

{
"cursor" : "BtreeCursor timestamp_1",
"isMultiKey" : false,
"n" : 124494,
"nscannedObjects" : 124494,
"nscanned" : 124494,
"nscannedObjectsAllPlans" : 124494,
"nscannedAllPlans" : 124494,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 45,
"nChunkSkips" : 0,
"millis" : 46338,
"indexBounds" : {
"timestamp" : [
[
1380520800000,
1380558200000
]
]
},
"server" : "ip-XXXXXXXX:27017"
}

最佳答案

解释输出再理想不过了。您通过索引 (nscanned) 找到了 124,494 个文档,它们都是有效结果,所以它们都被返回 (n)。它仍然不是仅索引查询,因为边界不是在特定文档中找到的精确值。

这个查询有点慢的原因可能是它返回的数据量很大。您找到的所有文档都必须从硬盘驱动器(当集合是冷的)读取、扫描、序列化、通过网络发送到客户端并由客户端反序列化。

您的用例真的需要那么多数据吗?如果答案是肯定的,响应能力真的很重要吗?我不知道您实际想要创建哪种应用程序,但我猜测您的应用程序是三种用例之一:

  1. 您想以某种报告的形式显示所有这些数据。这意味着输出将是一个巨大的列表,用户必须滚动浏览。在那种情况下,我建议使用分页。只加载适合一个屏幕的数据,并提供 nextprevious 按钮。 MongoDB 分页可以使用游标方法 .limit(n).skip(n) 完成。
  2. 以上,但它是某种离线报告,用户可以下载然后使用各种数据挖掘工具进行检查。在这种情况下,初始加载时间是可以接受的,因为用户会花一些时间处理他们收到的数据。
  3. 您不想向用户显示所有这些原始数据,而是对其进行处理并以某种聚合方式呈现,例如统计数据或图表。在那种情况下,您可能已经使用聚合框架在数据库上完成了所有这些工作。

关于MongoDB - 查询超过 1000 万条记录的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23778620/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com