【发布时间】:2020-01-10 11:55:28
【问题描述】:
我最近开始将数据从 Microsoft SQL Server 转移到 MongoDB 以获得可扩展性。就移民而言,一切都很好。
该文档有 2 个重要字段:客户、timestamphash(年月日)。
我们在安装 MongoDB 的 Azure Linux 中仅导入了 7500 万个数据。 在两个字段上添加复合索引后,我们遇到了以下问题:
在 300 万条数据上(过滤后),按 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 秒。
【问题讨论】:
-
“在两个字段上添加索引后”——您是在两个字段上创建复合索引还是两个单独的索引?您能否分享您创建的确切索引和您尝试支持的查询模式?
-
我在两个字段上都创建了一个复合索引,并通过说明使用了该索引进行了测试。
-
谢谢!复合索引的顺序是什么?客户至上,对吧?该聚合是您正在运行的主要查询吗?您可以考虑添加 Device 以使其成为覆盖查询
-
在 mongo 文档中,group by 语句不使用索引。我用 {allowDiskUse:true} 解决了这个问题。
标签: mongodb performance indexing aggregation-framework