我的 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()
有这我有几个问题
-
unicloud-db 内部有没有使用游标查询,或有没有办法本身就实现游标查询。
-
我自己实现了游标查询,根据优化文档: https://doc.dcloud.net.cn/uniCloud/db-performance.html#skip 这个地方的建议,但还是一样慢,为什么?
-
unicloud-db 内部的条件,在有 getTemp 的时候,联表。象 orderBy 和 where 是应用到主表上吗?
-
如果应用到主表, 为什么查询的速度和我在 JQL 中不一样。上面二个句子中, 如果是应用到主表, 应该和我查询快的语句是一样。
-
同样的语句, 在 JQL 中慢也只要 2s 为什么在 unicloud-db 就超过 5 秒。
凯哥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(),
],
是这样联表的。
page-data="replace"
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