uni-app中2万条数据阿里云空间数据库联表查询超时 请教如何优化数据库查询性能

发布于 1周前 作者 songsunli 来自 Uni-App

uni-app中2万条数据阿里云空间数据库联表查询超时 请教如何优化数据库查询性能

代码示例

JavaScript 代码

// 数据源为 collectionList
<unicloud-db ref="udb" :collection="collectionList" :where="where" page-data="replace" :orderby="orderby"
             :getcount="true" :page-size="options.pageSize" :page-current="options.pageCurrent"
             v-slot:default="{data,pagination,loading,error,options}" :options="options" loadtime="manual"
             @load="onqueryload">
</unicloud-db>

// collectionList 的定义
collectionList: [
    db.collection('Wenzhou-order').field(
        'ReceivingOrders_id,deliveryer_id'
    ).getTemp(),
    db.collection('uni-id-users').field('nickname as text, _id').getTemp()
],

// 界面搜索传入的参数
<uni-th align="center" filter-type="search"
       @filter-change="filterChange($event, 'ReceivingOrders_id.text')">下单员名称</uni-th>
<uni-th align="center" filter-type="search"
       @filter-change="filterChange($event, 'deliveryer_id.text')">配送员名称</uni-th>

// 执行搜索的函数
filterChange(e, name) {
    this._filter[name] = {
        type: e.filterType,
        value: e.filter
    }
    console.log(e.filter)
    console.log(name)

    this.where = name + "== '" + e.filter + "'"

    console.log(this.where);
    this.$nextTick(() => {
        this.$refs.udb.loadData()
    })
}

// schema
"ReceivingOrders_id": {
    "bsonType": "string",
    "title": "下单员名称",
    "description": "下单者ID,参考`uni-id-users` 表",
    "foreignKey": "uni-id-users._id",
    "defaultValue": {
        "$env": "uid"
    }
},
"deliveryer_id": {
    "bsonType": "string",
    "title": "配送员名称",
    "description": "配送员ID,参考`uni-id-users` 表",
    "foreignKey": "uni-id-users._id",
    "enum": {
        "collection": "uni-id-users",
        "field": "nickname as text, _id as value"
    },
    "defaultValue": ""
},

问题描述

数据表大约有2万条数据,我的疑问是 ReceivingOrders_id 字段在界面搜索能成功,但是 deliveryer_id 字段就搜索超时,要求优化。我看了 uniCloud 数据库性能优化 这里也没看懂,不知道怎么设置索引和优化联表才可以生效,麻烦赐教。

图片


5 回复

设置给order表ReceivingOrders_id,deliveryer_id设置索引。
联表时增加一些条件缩小联表查询数据量。
数量大的话不建议使用skip进行分页,例如:可以使用_id进行倒序排序后查询。


请问怎么利用_id分页!_id可以比大小吗!

回复 hws007: 可以了解一下游标分页

文档有写优化!先过滤主表!再联表查询!速度会快,也就是你要先条件查询Wenzhou-order表!

在uni-app中处理大量数据联表查询时,优化数据库查询性能是关键。以下是一些优化策略及代码示例,特别是针对阿里云空间数据库(假设为MongoDB或MySQL)的查询优化。

1. 分页查询

避免一次性加载大量数据,使用分页查询来减少单次查询的数据量。

MongoDB示例

const pageSize = 1000; // 每页大小
const pageNumber = 1; // 页码

db.collection('your_collection')
  .skip((pageNumber - 1) * pageSize)
  .limit(pageSize)
  .find({})
  .toArray((err, docs) => {
    if (err) throw err;
    console.log(docs);
  });

MySQL示例

SELECT * FROM your_table
LIMIT 1000 OFFSET 0; -- 页码从0开始,每页1000条

2. 索引优化

确保查询字段上有适当的索引,可以显著提高查询速度。

MongoDB示例

db.collection('your_collection').createIndex({ field_to_index: 1 }); // 1表示升序,-1表示降序

MySQL示例

CREATE INDEX idx_field_to_index ON your_table(field_to_index);

3. 减少联表查询复杂度

如果联表查询复杂度高,考虑是否可以通过设计数据库结构(如使用嵌套文档或数组)来减少联表需求。

MongoDB示例(使用嵌套文档):

db.collection('orders').insertOne({
  order_id: 1,
  customer: { name: 'John Doe', email: 'john@example.com' },
  items: [
    { product_id: 100, quantity: 2 },
    { product_id: 101, quantity: 1 }
  ]
});

4. 使用聚合框架

对于复杂查询,MongoDB的聚合框架可能比联表查询更高效。

MongoDB聚合示例

db.collection('orders')
  .aggregate([
    { $lookup: { from: 'customers', localField: 'customer_id', foreignField: '_id', as: 'customer_details' } },
    { $unwind: '$customer_details' },
    { $match: { 'customer_details.status': 'active' } }
  ])
  .toArray((err, results) => {
    if (err) throw err;
    console.log(results);
  });

5. 数据库配置优化

检查数据库配置,如内存分配、连接池设置等,确保数据库能够高效处理查询。

总结

优化数据库查询性能需要从多个方面入手,包括分页查询、索引优化、减少联表复杂度、使用聚合框架以及调整数据库配置。通过上述方法,可以显著提高uni-app中处理大量数据时的查询效率。具体实现时,还需根据实际应用场景和数据特性进行调整。

回到顶部