如果从mysql导出百万数据级的excel,可能遇到的问题?
同步导数据,接口很容易超时。
如果把所有数据一次性装载到内存,很容易引起OOM。
数据量太大sql语句慢。
如果走异步,如何通知用户导出结果
如果excel文件太大,目标用户打不开怎么办
解决方案??
-
java层面
-
异步处理
不需要立马返回结果的接口可以采用异步的方式让接口立刻返回结果,可以防止接口耗时过长导致tomcat线程池打满。
调用接口,直接调用异步任务
-
使用流式存储
百万级别的数据,从数据库一次性查询出来,是一件非常耗时的工作。即使我们可以从数据库中一次性查询出所有数据,没出现连接超时问题,这么多的数据全部加载到应用服务的内存中,也有可能会导致应用服务出现OOM问题。
使用easyexcel,或者流式存储的方式进行读取。easyexcel能大大减少占用内存的主要原因是:在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。
-
分成多个文件,防止条数太多,打不开的情况
设置条数上线,让每个excel的表格达到一定数量,自动分成下一个文件。然后压缩包的方式返回
-
多线程
-
-
mysql层面
-
优化索引
针对报表中频繁查询的字段,添加适当的索引,从而加快数据的检索速度。特别是在 WHERE 和 ORDER BY 子句中使用的列上创建索引,这有效提升了查询效率。
-
游标查询
或者滚动翻页的方式?正在学习原理
MySQL批量查询、数据同步、数据导出可以使用类似于分页查询的思路,但是鉴于LIMIT offset,size的效率太低,可以采用”滚动翻页”的实现方式 注意要用自增趋势的主键
-