数据一多 排序变得非常缓慢 即使加了索引查询也非常缓慢 如果不加排序 数据正常是反着的 如何才能让_id的索引改为倒序 这个后加的就能排前面了
- 发布:2023-05-19 13:13
- 更新:2023-05-19 13:46
- 阅读:613
Diligent_UI - 【插件开发】【专治疑难杂症】【多款插件已上架:https://ext.dcloud.net.cn/publisher?id=193663(微信搜索飘逸科技UI小程序直接体验)】【骗子请绕道】问题咨询请加QQ群:120594820,代表作灵感实用工具小程序
一般数据库数据预览那个表格每一个列都有排序功能
杨杨杨 (作者)
我进行了联表查询 如果不联表 加排序不加排序性能没什么损失 如果联表以后 加排序不加排序性能差别巨大
db.collection("card-goods-order").field("_id,gid,uid,orderNo,ctime").limit(20).get({getCount:true})
24万条 耗时660ms
db.collection("card-goods-order").field("_id,gid,uid,orderNo,ctime").orderBy("ctime desc").limit(20).get({getCount:true})
24万条 耗时670ms
db.collection(db.collection("card-goods-order").field("_id,gid,uid,orderNo,ctime").getTemp(), db.collection("uni-id-users").field("_id,nickname,id").getTemp(), db
.collection("card-goods").field("_id,short,channel_name,name").getTemp()
).limit(20).get({getCount:true})
24万条 耗时690ms
db.collection(db.collection("card-goods-order").field("_id,gid,uid,orderNo,ctime").getTemp(), db.collection("uni-id-users").field("_id,nickname,id").getTemp(), db
.collection("card-goods").field("_id,short,channel_name,name").getTemp()
).orderBy("ctime desc").limit(20).get({getCount:true})
24万条 耗时1950ms
db.collection(db.collection("card-goods-order").field("_id,gid,uid,orderNo,ctime").orderBy("ctime desc").getTemp(), db.collection("uni-id-users").field("_id,nickname,id").getTemp(), db
.collection("card-goods").field("_id,short,channel_name,name").getTemp()
).limit(20).get({getCount:true})
24万条 耗时1770ms
-
杨杨杨 (作者)
回复 DCloud_uniCloud_WYQ:
db.collection(db.collection("card-goods-order").field("_id,gid,uid,orderNo,ctime").orderBy("_id desc").limit(20).getTemp(), db.collection("uni-id-users").field("_id,nickname,id").getTemp(), db
.collection("card-goods").field("_id,short,channel_name,name").getTemp()
).get({getCount:true})
耗时1870ms 没有改观
2023-05-20 13:04
-
回复 q***@foxmail.com: 主表20万还是副表?getCount先去掉试试,第二个副表也先去掉,分别测试一下耗时多久
2023-05-22 11:42
-
杨杨杨 (作者)
回复 DCloud_uniCloud_WYQ: 主表20万 用户副表5千 第二个副表3百条 去掉第二个副表 性能无差别 去掉getCount 变为1200ms 去掉 getCount 和orderBy 300ms 仅去掉orderBy 700ms 我QQ745547797 可远程
2023-05-22 11:53
-
杨杨杨 (作者)
const dbCmd = db.command
const $ = dbCmd.aggregate
db.collection("card-goods-order").aggregate().sort({
_id:-1
}).limit(20).lookup({
from: 'uni-id-users', //用户信息
let: {
uid: '$uid',
},
pipeline: $.pipeline()
.match(dbCmd.expr($.and([
$.eq(['$_id', '$$uid']),
]))).project({
nickname: true,
id: true,
})
.done(),
as: 'user',
})
.end()
用这种方式效率是最高的 200ms 相似写法db.collection(db.collection("card-goods-order").field("_id,gid,uid,orderNo,ctime").orderBy("_id desc").limit(20).getTemp(), db.collection("uni-id-users").field("_id,nickname,id").getTemp()
).get()
用是1200ms2023-05-22 12:04
-
杨杨杨 (作者)
回复 DCloud_uniCloud_WYQ: 都是以admin执行的 是用的JQL执行器 并没有其他额外权限设置 就那个排序好像并没有用上索引 我用的_id倒序 如果不使用排序速度是快的 加上排序 耗时近2秒 有时还会超时
2023-05-22 17:42
-
回复 q***@foxmail.com: jql执行器是很慢的,因为包含了公网传输以及可能出现的密钥获取。建议在云函数里面进行测试
2023-05-22 19:44
-
杨杨杨 (作者)
回复 DCloud_uniCloud_WYQ: 主要是uni-admin的unicloud-db里用 这个应该和网络区别不大 我用原生的聚合也才200ms 性能瓶颈出现在orderBy这里 还是应该检查一下JQL语法是不是生成的语句没有用到索引
2023-05-22 22:41
杨杨杨 (作者)
unicloud 的数据库
2023-05-19 13:24