Skip to content

百万easyexcal数据导出

1.先准备一个大表数据

创建表t_student ,手动插入几条数据,然后 执行下面这个sql语句,让他帮我们生成测试数据

shell
INSERT INTO t_student (name, sex, birthday, phone, address, hobby, pic, password)
SELECT
  CONCAT('Student', id) AS name,
  CASE WHEN RAND() < 0.5 THEN 'Male' ELSE 'Female' END AS sex,
  DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP('1990-01-01') + FLOOR(RAND() * (DATEDIFF('2022-01-01', '1990-01-01')))), '%Y-%m-%d') AS birthday,
  CONCAT('1', LPAD(FLOOR(RAND() * 1000000000), 9, '0')) AS phone,
  CONCAT('Address', FLOOR(RAND() * 1000)) AS address,
  CONCAT('Hobby', FLOOR(RAND() * 100)) AS hobby,
  CONCAT('pic', LPAD(FLOOR(RAND() * 100), 2, '0'), '.jpg') AS pic,
  MD5(RAND()) AS PASSWORD
FROM
  (SELECT @id := @id + 1 AS id FROM t_student, (SELECT @id := 0) AS init_id LIMIT 5000000) AS id_generator;

这里我准备了600+万数据,建议大家准备一个千万级别的表,了解一下当数量级大的时候,量变所引起的质变,以及对大表的查询的大致耗时与优化

2.准备easyexcel 环境的demo

如果不做任何处理,直接导出数据到excel ,先不说请求耗时,后端会直接报错,因为excel的sheet最大存104万+的数据

所以需要把数据写到多个sheet页,然后 考虑 超时的问题 ,我测了下 一个线程 写600+万数据 每次分页查询20万条记录到 excel 中 需要 5分钟 基本是 120 +万数据 需要一分钟,每次查询100万条记录到excel 中 3分30秒 左右, 那咱们每次查100 万 不是好一点,但是这里使用空间换时间,每次查100万,对内存的压力较大,如果服务器内存紧张的话,还是要考虑分页大小。但是不管是哪种方式, 都太慢了,不能让用户等几分钟啊 怎么办?

image-20231213181612580

3.优化

首先考虑到并发,但是easyexcel 开篇就说 不支持 单个文件的并发读写

image-20231213181827273

所以 怎么办?