百万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万,对内存的压力较大,如果服务器内存紧张的话,还是要考虑分页大小。但是不管是哪种方式, 都太慢了,不能让用户等几分钟啊 怎么办?
3.优化
首先考虑到并发,但是easyexcel 开篇就说 不支持 单个文件的并发读写
所以 怎么办?