大数据量导出(Excel / CSV / 数据库 dump 等)常见瓶颈在 内存、IO、数据库查询、序列化、网络。下面从「思路 → 具体手段 → 常见方案」系统讲一下优化方法。
一句话原则:
避免一次性加载全部数据,边查边写、流式处理、减少不必要开销
SELECT *-- 不好
SELECT * FROM orders;
-- 好
SELECT id, user_id, amount, create_time FROM orders;
不要用 LIMIT offset, size(offset 越大越慢)
✅ 推荐:基于主键或时间游标
SELECT * FROM orders
WHERE id > :lastId
ORDER BY id
LIMIT 1000;
或使用数据库游标(如 MySQL stream、PostgreSQL DECLARE CURSOR)
❌ 错误方式:
List<Order> list = dao.findAll(); // OOM
export(list);
✅ 正确方式:
while (hasNext) {
List<Order> batch = dao.queryNext();
writer.write(batch);
}
EasyExcel.write(outputStream, Order.class)
.sheet("data")
.doWrite(dataIterator);
BufferedWriter常见经验值:
太大:内存涨
太小:IO 次数多
BufferedOutputStream
BufferedWriter
流程:
✅ 用:
COPY TOCOPY orders TO '/tmp/orders.csv' CSV HEADER;
❌ 一次性查全表
❌ 用 POI 写大 Excel
❌ 在接口里同步导出
❌ 导出时做复杂计算
✅ 流式
✅ 异步
✅ 批处理
✅ 简单化
| 数据量 | 推荐方案 |
|---|---|
| < 10 万 | 同步 + EasyExcel |
| 10–100 万 | 异步 + CSV |
| > 100 万 | 分片 + 压缩 + OSS |
| TB 级 | 数仓 / Spark 导出 |
如果你能告诉我:
我可以给你更具体的代码级方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。