导出性能优化

导出的标准流程

  1. 查询数据
  2. 生成excel
  3. 浏览器下载

导出遇到的问题

  1. 时间过长 (未用索引、查询数据过大、查询次数过多)
  2. 内存不够 (测试环境 和 生产环境差异)
  3. 本地环境无扩展

解决思路

  1. 不断优化sql,让查询次数尽量少
  2. 优化代码逻辑,减少循环中套循环
  3. mock excel生成

核心思想

让计算交给最快的处理者(DB、内存)来做

让计算只算一次

案例

门店提货订单导出

优化点:

8000多个订单(1万多商品)全部导出由当初60s 降至 5.72s

数字福利平台大牌卡券导出

优化点

内存方面

单次查询能解决 不需要多次查询组装的 用游标,比chunk 快(chunk将一次查询拆多次分页了)

需要多次查询组装的, 可以考虑多进程分文件写入 最后合并

思考

PHP 处理大数组 给某个键 进行字符串格式化 快 还是 数据库快

如 有30000的数据 每个数据有时间戳create_time 循环30000次 date('Y-m-d H:i:s', $v['create_time'])
还是 查询结果集时 'create_time' => DB::raw('FROM_UNIXTIME(a.create_time)'),字段计算快?

前端生成excel 快还是 后端扩展快?

json 格式比较大 是否需要将数据压缩 gzip 或改为 ProtocolBuffer 传输更快

xlsx 单sheet 有上限

如何应对同条件导出多次?

缓存、 异步