mongodb - MongoDB聚合查询性能提升
问题描述
我最近开始将数据从 Microsoft SQL Server 转移到 MongoDB 以获得可伸缩性。就移民而言,一切都很好。
该文档有 2 个重要字段:客户、timestamphash(年月日)。
我们在安装 MongoDB 的 Azure Linux 中仅导入了 7500 万个数据。在两个字段上添加复合索引后,我们遇到了以下问题:
在 3 百万数据上(过滤后),按 customerId 计数完成聚合组需要 24 秒。SQL Server 在不到 1 秒的时间内对相同的数据给出结果。
你认为 Casandra 会是一个更好的解决方案吗?我们需要对大量数据的查询性能。
我尝试了磁盘写入,为 VM 提供了更多 RAM。没有任何效果。
询问:
aaggregate([
{ "$match" : { "Customer" : 2 } },
{ "$match" : { "TimestampHash" : { "$gte" : 20160710 } } },
{ "$match" : { "TimestampHash" : { "$lte" : 20190909 } } },
{ "$group" : { "_id" : { "Device" : "$Device" }, "__agg0" : { "$sum" : 1 } } },
{ "$project" : { "Device" : "$_id.Device", "Count" : "$__agg0", "_id" : 0 } },
{ "$skip" : 0 },
{ "$limit" : 10 }])
更新: 我使用了“allowDiskUse:true”,问题就解决了。过滤 3M 数据的时间减少到 4 秒。
解决方案
我之前遇到过类似的问题,在这个问题中,老实说,我猜 Cassandra 在你的某些情况下更好,但问题是关于 Mongo 聚合查询优化,对吧?
就目前而言,我的一个集合拥有超过 300 万个文档,如果您正确构建索引,聚合查询不应该花费 24 秒。
- 首先,通过 Mongo Compass 查看索引使用情况。Mongo真的在使用它吗?如果您的应用程序
spam
查询数据库并且您index
的使用量为 0(如下例所示),那么正如您已经猜到的那样,您的索引有问题。 第二件事是,使用
explain
方法(此文档将帮助您)查看有关您的query
.第三个:索引字段排序很重要。例如,如果您有
$match
3 个字段的阶段并且您按字段请求文档:
{ $match: {a_field:a, b_field:b, c_field:c} }
那么你应该compound
以完全相同的顺序在 a、b、c 字段上建立索引。
总是存在某种数据库架构问题。我强烈建议您不要将stockpile
所有数据放在一个集合中。{timestamps:true}
在插入时使用(它创建了两个字段,例如createdAt:
和updatedAt:
{
timestamps: true
}
在您的架构中,将旧时/过时的数据存储在不同的集合中,并在您确实需要对它们进行操作时为它们使用$lookup
聚合方法。
希望你能在我的回答中找到有用的东西。
推荐阅读
- angular - Angular Nx 和 NgRx:应用程序没有响应
- c++ - c++ while(cin>>s)什么时候停止
- html - Angular 5数据列表需要在点击时显示描述需要发送值
- python - 从列表中的 dict 创建一个整数。蟒蛇新手
- jquery - 使用 Javascript setTimeout/setInterval 打开一个弹出窗口并在几秒钟后自动关闭它
- javascript - 更改日期字符串的格式
- sql - SQL Server - 删除重复行并维护现有主键
- java - 如何在java中存储列表中的匹配元素
- javascript - 我不断收到此错误,XML Parsing error: syntax error 但网站仍然运行良好
- c++ - 空包可变参数模板