






















这是一个创建于 824 天前的主题,其中的信息可能已经有所发展或是发生改变。
问题背景:
现在有个一个集合,每月大概会往里插入将近 600M 的数据,项目项目上线了将近 4 个月,有 2500W 数据,现在 count 一次,需要将近 1~2 分钟,即使使用了各类索引优化,还是没什么太大作用。
我想请教一下大家,遇到这中情况,该如何优化呢,或者说,有什么更合适的方案去在这种数据量下进行 count 查询呢?
谢谢!
第 1 条附言 · 2024 年 3 月 13 日
大概的查询语句
集合schema
{
//...省略其他字段
"_id": ObjectId("65e9310b6c21fc6df939c43d"),
"nodeType": "start",
"executeTime": ISODate("2024-03-07T03:14:19.708Z"),
"isDetail": false,
}
索引
{
"executeTime": -1,
"nodeType": 1,
"isDetail": 1,
}
查询语句
db.collection.countDocuments({
"executeTime": {
$gte: new Date(new Date().getTime() - 30 * 24 * 60 * 60 * 1000),
$lte: new Date()
},
"nodeType": "interactive",
"isDetail": true,
}, {
"executeTime": 1
"nodeType": 1,
"isDetail": 1,
"_id": 1,
})
1 Yuan2One 2024 年 3 月 13 日 via Android只查总数吗,存 redis 可以吗 |
3 coderxy 2024 年 3 月 13 日这个要看你索引的定义, 一般 count 条件语句的第一个字段非常重要,要用比较稀疏的字段, 还是要具体分析的。 你可以把你的字段和查询条件贴出来,具体分析一下看看。 |
4 defunct9 2024 年 3 月 13 日开 ssh ,让我上去看看 |
7 Belmode 2024 年 3 月 13 日@coderxy #3 集合结构和查询语句 集合 schema 查询语句 |
8 coderxy 2024 年 3 月 13 日@Belmode nodeType 存在的值多不多? 多的话拿 nodeType 做联合索引第一位,isDetail=true 的情况多不多,多的话拿 isDetail 做第一位,反正索引要么是 nodeType_isDetail_executeTime 要么是 isDetail_nodeType_executeTime ,你再去试试,性能应该回好不少。 你现在的索引用法,估计 explain 分析一下,seek 特别多。 最终的效果可能相当于只有 executeTime 单索引的效果。 |
9 rrfeng 2024 年 3 月 13 日 via Android这索引没啥可以优化的,只能走预计算了。 |
10 mingsz 2024 年 3 月 13 日executeTime 需要查询的那么精确吗,可以新增个字段,如果到天/小时,索引会小很多 |
11 ychost 2024 年 3 月 13 日这个感觉没太大优化点了,每天提前把所有条件都查一遍吧,然后前端值允许查看预制的筛选条件 |
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。