Sar*_*air 3 indexing mongodb aggregation-framework
我有一个带有以下结构的分片集合"my_collection":
{
"CREATED_DATE" : ISODate(...),
"MESSAGE" : "Test Message",
"LOG_TYPE": "EVENT"
}
Run Code Online (Sandbox Code Playgroud)
mongoDB环境使用2个分片进行分片.使用LOG_TYPE上的Hashed分片键对上面的集合进行分片.LOG_TYPE属性还有7种其他可能性.
我在"my_collection"中有100万个文档,我试图使用以下查询找到基于LOG_TYPE的文档计数:
db.my_collection.aggregate([
{ "$group" :{
"_id": "$LOG_TYPE",
"COUNT": { "$sum":1 }
}}
])
Run Code Online (Sandbox Code Playgroud)
但这让我得到了大约3秒的结果.有没有办法改善这个?此外,当我运行explain命令时,它显示没有使用索引.group命令是否不使用索引?
目前,聚合框架可以采取哪些措施来提高查询性能,但您可以通过以下方式提供帮助:
db.my_collection.aggregate([
{ "$sort" : { "LOG_TYPE" : 1 } },
{ "$group" :{
"_id": "$LOG_TYPE",
"COUNT": { "$sum":1 }
}}
])
Run Code Online (Sandbox Code Playgroud)
通过在LOG_TYPE上添加排序,您将"强制"优化器使用LOG_TYPE上的索引来按顺序获取文档.这将以多种方式改善性能,但根据使用的版本而有所不同.
对于实际数据,如果您对进入$ group阶段的数据进行了排序,则会提高总计累积的效率.您可以看到不同的查询计划,其中$ sort将使用分片键索引.这实际性能的改进将取决于每个"桶"中的值的数量 - 通常LOG_TYPE只有七个不同的值使得它成为一个非常差的分片键,但它确实意味着下面的代码很可能是一个甚至比优化聚合快得多:
db.my_collection.distinct("LOG_TYPE").forEach(function(lt) {
print(db.my_collection.count({"LOG_TYPE":lt});
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7329 次 |
| 最近记录: |