云开发数据库联表查询,最开始表现优异,随着数据量的增加,某条语句的查询时间居然超过了2秒。后面着手优化查询到100毫秒以内。
优化主要事项:
1、将条件(match)、排序(sort)、分页(skip、limit)移到联表之前,先查出部分结果后再联表操作。
2、取消模糊查询连接后的子表字段。
优化后的语句如下:
db.collection("form_answers")
.aggregate()
.match({
_openid: "xxxx"
})
.sort({
createTime: -1
})
.skip(0)
.limit(20)
.lookup({
from: 'forms',
let: {
formId: '$formId'
},
pipeline: $.pipeline()
.match(_.expr($.and([
$.eq(['$_id', '$$formId']),
])))
.project({
_id: 0,
name: 1,
unionid: 1
})
.done(),
as: 'formList',
})
.replaceRoot({
newRoot: $.mergeObjects([{
formName: $.arrayElemAt(['$formList.name', 0]),
formUnionid: $.arrayElemAt(['$formList.unionid', 0])
}, '$$ROOT'])
})
.project({
formList: 0
})
.end()
明天试试