凯哥iak
凯哥iak
  • 发布:2024-08-31 10:03
  • 更新:2024-09-03 12:51
  • 阅读:135

unicloud-db 前端组件大数据 70 万条比 JQL 慢成狗了(2850ms vs 251ms)请教优化方案

分类:uniCloud

我的 uni-id-log 的表有 70 万条数据,我怎么样才能让它查快一些。我使用的 unicloud-db,我想使用游标查询的方式,我使用了 create_data 来做, 一样超过 5s 直接超时慢查询。

这是我代码的查询, 这种查询很慢, 用时 2850ms


                const log = db.collection("uni-id-log")  
                  .field("type, ip, create_date, user_id,appid")  
                  .getTemp()  
                const user = db.collection("uni-id-users")  
                  .field("_id, username,nickname,wx_openid")  
                  .getTemp()  

                db.collection(log, user).orderBy('create_date desc').limit(10).get()

这个查询用到了 unicloud-db 上, 我猜 .orderBy('create_date desc').limit(10) 是这样。

下面我手工写了, 如下查询, 这种查询很快(251ms)


                const log = db.collection("uni-id-log")  
                  .field("type, ip, create_date, user_id,appid")  
                  .orderBy('create_date desc').limit(10).getTemp()  
                const user = db.collection("uni-id-users")  
                  .field("_id, username,nickname,wx_openid")  
                  .getTemp()  

                db.collection(log, user).get()

有这我有几个问题

  1. unicloud-db 内部有没有使用游标查询,或有没有办法本身就实现游标查询。

  2. 我自己实现了游标查询,根据优化文档: https://doc.dcloud.net.cn/uniCloud/db-performance.html#skip 这个地方的建议,但还是一样慢,为什么?

  3. unicloud-db 内部的条件,在有 getTemp 的时候,联表。象 orderBy 和 where 是应用到主表上吗?

  4. 如果应用到主表, 为什么查询的速度和我在 JQL 中不一样。上面二个句子中, 如果是应用到主表, 应该和我查询快的语句是一样。

  5. 同样的语句, 在 JQL 中慢也只要 2s 为什么在 unicloud-db 就超过 5 秒。

2024-08-31 10:03 负责人:DCloud_uni-ad_HDX 分享
已邀请:
DCloud_uniCloud_WYQ

DCloud_uniCloud_WYQ

  1. 你的索引是怎么建的,uni-id-log表create_date有索引吗
  2. where和orderBy写在哪个临时表就是应用到那个临时表的,只写where属性是应用到联表后
  3. 见3
  4. 见3

另外unicloud-db支持collection属性配置临时表,可以用来优化你的联表查询

  • 凯哥iak (作者)

    create_date 有索引. 创建了。


    where和orderBy写在unicloud-db组件本身。所以他其实是给几十万数据查询出来以后,然后才合并的是吧。


    export default {

    data() {

    return {

    collectionList: [

    db

    .collection("uni-id-log")

    .field("type, ip, create_date, user_id,appid")

    .getTemp(),

    db

    .collection("uni-id-users")

    .field("_id, username,nickname,wx_openid")

    .limit(1)

    .getTemp(),

    ],

    是这样联表的。



    <unicloud-db

    ref="udb"

    collection="collectionList"

    options="options"

    where="where"
    page-data="replace"

    orderby="orderby"

    getcount="true"

    page-size="options.pageSize"

    page-current="options.pageCurrent"
    v-slot:default="{ data, pagination, loading, error }"

    loadtime="manual"

    >

    这是组件。


    所以优化方案是?


    我直接在 db

    .collection("uni-id-log")

    .field("type, ip, create_date, user_id,appid")

    .getTemp(), 中加入排序与分页? 但这样原来的分布是不是就不能使用了。

    2024-09-03 12:50

  • DCloud_uniCloud_WYQ

    回复 凯哥iak: 是这样优化,分页确实需要改一下

    2024-09-04 11:26

凯哥iak

凯哥iak (作者) - 凯哥

1111

要回复问题请先登录注册