杨杨杨
杨杨杨
  • 发布:2023-05-19 13:13
  • 更新:2023-05-19 13:46
  • 阅读:509

_id如何更改索引为倒序

分类:uniCloud

数据一多 排序变得非常缓慢 即使加了索引查询也非常缓慢 如果不加排序 数据正常是反着的 如何才能让_id的索引改为倒序 这个后加的就能排前面了

2023-05-19 13:13 负责人:无 分享
已邀请:
piaoyi_UI

piaoyi_UI - 【插件开发】【专治疑难杂症】【多款插件已上架:https://ext.dcloud.net.cn/publisher?id=193663(微信搜索飘逸科技UI小程序直接体验)】【骗子请绕道】问题咨询请加QQ群:120594820,代表作灵感实用工具小程序

一般数据库数据预览那个表格每一个列都有排序功能

  • 杨杨杨 (作者)

    unicloud 的数据库

    2023-05-19 13:24

杨杨杨

杨杨杨 (作者)

我进行了联表查询 如果不联表 加排序不加排序性能没什么损失 如果联表以后 加排序不加排序性能差别巨大

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

    limit方法也放主表的temp表内

    2023-05-19 18:18

  • 杨杨杨 (作者)

    回复 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

  • 杨杨杨 (作者)

    回复 DCloud_uniCloud_WYQ: 大佬确认一下问题吧, 才二十万数据就有性能问题 这是个问题

    2023-05-21 09:38

  • DCloud_uniCloud_WYQ

    回复 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()

    用是1200ms

    2023-05-22 12:04

  • DCloud_uniCloud_WYQ

    回复 q***@foxmail.com: 那可能是你的数据表权限写的太复杂了,你试试以admin身份调用看看耗时多久

    2023-05-22 17:27

  • 杨杨杨 (作者)

    回复 DCloud_uniCloud_WYQ: 都是以admin执行的 是用的JQL执行器 并没有其他额外权限设置 就那个排序好像并没有用上索引 我用的_id倒序 如果不使用排序速度是快的 加上排序 耗时近2秒 有时还会超时

    2023-05-22 17:42

  • DCloud_uniCloud_WYQ

    回复 q***@foxmail.com: jql执行器是很慢的,因为包含了公网传输以及可能出现的密钥获取。建议在云函数里面进行测试

    2023-05-22 19:44

  • DCloud_uniCloud_WYQ

    回复 q***@foxmail.com: 注意在云端运行云函数

    2023-05-22 20:12

  • 杨杨杨 (作者)

    回复 DCloud_uniCloud_WYQ: 主要是uni-admin的unicloud-db里用 这个应该和网络区别不大 我用原生的聚合也才200ms 性能瓶颈出现在orderBy这里 还是应该检查一下JQL语法是不是生成的语句没有用到索引

    2023-05-22 22:41

  • DCloud_uniCloud_WYQ

    回复 q***@foxmail.com: 我远程看看吧

    2023-05-23 11:11

要回复问题请先登录注册