現(xiàn)象:
mongodb cpu動(dòng)不動(dòng)要100%,如下圖
? ? ? ? ? ? ? ?
分析原因:
查看慢日志發(fā)現(xiàn),很多條這樣的查詢,一直未執(zhí)行行完成,占用大量的CPU
[
{
$match: {
"tags.taskId": "64dae0a9deb52d2f9a1bd71e",
grnty: "minute",
"tags.type": "task",
"tags.taskRecordId":
"64e5c004133738231bc36906",
},
},
{
$sort: {
_id: -1,
},
},
{
$limit: 5,
},
{
$unwind: "$ss",
},
{
$group: {
_id: "$ss.vs.inputQps",
qps: {
$avg: "$ss.vs.inputQps",
},
},
},
]
查看程序里面有一段聚合的代碼
Criteria criteria = new Criteria();
tags.forEach((k,v)->{
String format = String.format(TAG_FORMAT, k);
criteria.and(format).is(v);
});
criteria.and(MeasurementEntity.FIELD_GRANULARITY).is(Granularity.GRANULARITY_MINUTE);
MatchOperation match = Aggregation.match(criteria);
SortOperation sort = Aggregation.sort(Sort.by(Sort.Direction.DESC, "_id"));
LimitOperation limit = Aggregation.limit(5);
UnwindOperation unwind = Aggregation.unwind("ss", false);
GroupOperation group = Aggregation.group().avg("ss.vs.inputQps").as("qps");
Aggregation aggregation = Aggregation.newAggregation(match, sort, limit, unwind, group);
看一下這個(gè)代碼也沒有多大問題,但是就是執(zhí)行很慢很慢,于是我explain這條語句,發(fā)現(xiàn)是先執(zhí)行全集合sort 然后再match的,理論上應(yīng)該是先match,然后再執(zhí)行針對(duì)查詢的結(jié)果做sort的
已經(jīng)使用了 $match 和 $sort 操作來篩選和排序文檔。仍然對(duì)整個(gè)集合進(jìn)行了排序?
這可能是由于 MongoDB 的查詢優(yōu)化器在執(zhí)行查詢時(shí)做出的決策。在 MongoDB 中,查詢優(yōu)化器會(huì)嘗試根據(jù)查詢計(jì)劃和索引來優(yōu)化查詢性能。在某些情況下,優(yōu)化器可能會(huì)選擇在 $match 操作之后對(duì)整個(gè)集合進(jìn)行排序,而不僅僅是對(duì) $match 操作篩選出的文檔進(jìn)行排序。這可能是因?yàn)閮?yōu)化器認(rèn)為在整個(gè)集合上進(jìn)行排序的成本更低,或者由于其他優(yōu)化策略。如果你希望只對(duì) $match 操作篩選出的文檔進(jìn)行排序,可以嘗試使用索引來優(yōu)化查詢。確保你的查詢條件和排序字段都有適當(dāng)?shù)乃饕@樣可以幫助優(yōu)化器做出更好的決策,以便只對(duì)篩選結(jié)果進(jìn)行排序。
解決方案
在這種情況下,你可以嘗試創(chuàng)建一個(gè)復(fù)合索引,包含篩選條件和排序字段。例如,你可以創(chuàng)建一個(gè)包含 "tags.taskId","grnty","tags.typ","tags.taskRecordId","_id" 字段的復(fù)合索引。這樣,MongoDB 在執(zhí)行查詢時(shí)可以使用該索引來加速篩選和排序操作。
?總結(jié)
為了只對(duì)篩選結(jié)果進(jìn)行排序,你可以嘗試以下步驟:
創(chuàng)建一個(gè)復(fù)合索引,包含篩選條件和排序字段。
確保查詢條件和排序字段在索引中的順序與聚合管道中的順序一致。文章來源:http://www.zghlxwxcb.cn/news/detail-677225.html
使用 explain() 方法來查看查詢的執(zhí)行計(jì)劃和索引使用情況,以便進(jìn)行優(yōu)化。文章來源地址http://www.zghlxwxcb.cn/news/detail-677225.html
到了這里,關(guān)于mongodb聚合排序的一個(gè)巨坑的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!