用云函数读取数据库经常超时,大家是怎样解决
工作人员
- 发布:2021-06-21 10:43
- 更新:2021-06-21 15:53
- 阅读:1007
工作人员 (作者)
显示超时,一共才3条数据
2021-06-21 21:27
DCloud_uniCloud_WYQ
回复 工作人员: 错误信息贴出来一下
2021-06-22 14:25
fuguxu
回复 DCloud_uniCloud_WYQ: 我也遇到了,请问会是什么原因呢,也设置了索引,但貌似不起作用,报这个: code: "\"FunctionBizError\""
message: "\"InternalServerError:errCode: InternalServerError | errMsg: operation exceeded time limit,集合fht_log_20211012操作超时,请参照此文档进行优化:https://uniapp.dcloud.net.cn/uniCloud/db-performance\""
2021-10-13 09:53
DCloud_uniCloud_WYQ
回复 1***@163.com: 你也是数据量很小的集合报的吗?
2021-10-13 11:05
DCloud_uniCloud_WYQ
回复 1***@163.com: 如果不是就参考提示里面的文档进行优化
2021-10-13 11:05
fuguxu
回复 DCloud_uniCloud_WYQ: 集合数据量在30万以上就会报这个错了,看了下优化文档,貌似只有设置索引那个能做,但是设置了索引,也不起作用
2021-10-13 11:18
DCloud_uniCloud_WYQ
回复 1***@163.com: 30万不至于,我们有个上千万数据的测试集合,设置合适索引的情况下查询没什么问题。你可以看一下是不是执行了带条件的count操作,或者查询条件和索引不匹配
2021-10-13 11:20
DCloud_uniCloud_WYQ
或者使用了较大的skip
2021-10-13 11:20
fuguxu
回复 DCloud_uniCloud_WYQ: 我是做了云函数URL化,在自己的管理后台调用的,看network请求2~3s,接口就返回这个错误信息了,都还没有达到超时时间,请问会是啥原因呢
2021-10-13 11:21
fuguxu
回复 DCloud_uniCloud_WYQ: 用了聚合操作里面的api: let {data:yesterday} = await yesterdayCollction.aggregate()
.match({
enter_time: dbCmd.and(dbCmd.gt(yesterdayBoundaries[0]), dbCmd.lt(yesterdayBoundaries[24]))
})
.bucket({
groupBy: '$enter_time',
boundaries: yesterdayBoundaries,
default: 'other',
output: {
// count: dbCmd.aggregate.sum(1),
deviceIds: dbCmd.aggregate.addToSet('$device_Id')
}
})
.end()
2021-10-13 11:23
fuguxu
回复 DCloud_uniCloud_WYQ: 另外我们设置的索引不是唯一的,因为有可能有重复的
2021-10-13 11:29
DCloud_uniCloud_WYQ
回复 fuguxu: 这个超时不是指云函数的超时,而是单次数据库请求的超时。单词数据库请求超过1秒无响应就会触发超时错误。你在第一步match之后一般筛选出多少数据?
2021-10-14 10:56
fuguxu
回复 DCloud_uniCloud_WYQ: 整个集合数据量在30~50万之间,第一次match总不会超过这个,个人感觉是bucket操作引起的超时,因为我把bucket去掉单纯match是没问题的,加上bucket就超时了,另外用hbuilderX在本地运行没有超时,URL化在前端调用就超时了,目前比较懵~~~
2021-10-14 11:13
DCloud_uniCloud_WYQ
回复 fuguxu: bucket操作确实比较耗时,第一步match的时候能把筛选出的数据集尽量弄小一些应该能缓解这个问题
2021-10-14 11:25
fuguxu
回复 DCloud_uniCloud_WYQ: 目前是把一次操作成分2次了,把match的数据量变小了,就没有超时~~~~
2021-10-14 15:06