mysql 数据导出问题

2018-02-02 11:48:10 +08:00
 imherer

用 nodejs 实现 总共有 12 个 table,每次导出需要把 12 张表里的部分内容全部导出,导出的数据总共加起来最多几万行左右(应该不超过 5W ) 要求把导出的结果放在 excel 或者.csv 文件里,看了下.csv 好像不支持多个标签 如果放在 excel 里的话可以用一个文件+12 标签搞定(分 12 个文件也没问题),.csv 的话应该只能分 12 个文件了,不过也可以

现在主要的问题是如何导出:

1.用户点击了导出按钮,12 张表依次 select 然后保存到 excel,然后再下载(或者全部导出写到一个文件里最后下载,或者 12 个文件打成 zip 再下载)

2.好像有一个SELECT INTO OUTFILE 的语句,这样的话就是分别导出为 12 个文件最后下载

不知道各位大佬有没有做过类似的功能,上面 2 种方式哪个效率高,还有别的实现方案吗?

4522 次点击
所在节点    Node.js
12 条回复
liuzuo
2018-02-02 12:25:36 +08:00
是不是可以使用 mysqldump 导出?
imherer
2018-02-02 12:26:57 +08:00
mysqldump 能导出为除 sql 以外的格式么?
fuyufjh
2018-02-02 12:44:14 +08:00
SELECT INTO OUTFILE 是个反模式,最好不要用。数据库应该只提供数据服务,不应该存储文件。举个例子,万一某天应用服务器和 MySQL 分开部署了呢?

个人觉得最佳方案是创建一个后台任务,异步执行,成功以后把文件放到指定的位置,把 URL 通知给前端
wdlth
2018-02-02 13:14:53 +08:00
用计划任务比较好,最好是配一个只读从库用于导出操作,不要在线上业务库做。
panpanpan
2018-02-02 14:27:31 +08:00
mysqldump 效率最高,并且支持 csv,导出之后一封邮件就发出去了
Cbdy
2018-02-02 14:38:06 +08:00
起一个异步任务,导出打包存到 OSS,然后通知后端服务,最近我就这么做了一个功能,Node.js 百来行代码
eslizn
2018-02-02 14:42:00 +08:00
6L 的异步才是正解,不然你数据量大了 web 实时处理必超时
imherer
2018-02-02 14:53:54 +08:00
@Cbdy 导出用是什么方式呢?
Cbdy
2018-02-02 15:24:34 +08:00
@imherer exceljs
abusizhishen
2018-02-02 17:22:21 +08:00
@fuyufjh 这个方式不错
qiuleo
2018-02-02 17:40:32 +08:00
生成数据的导出是 nodejs 的问题,跟 Mysql 一点关系都没有。如果说有关系,那就是怎么用 SQL 语句从 mysql 查出来而已,而怎么组装成需要的数据格式,是在 nodejs 里做的。看场景,如果只是一次导出,用 mysql 的 dump 也是可以。
neocanable
2018-02-02 17:53:24 +08:00
第二种明显是不可取的,千万不要用。

SELECT INTO OUTFILE 要求写入的目录 mysql 至少有写权限,如果你的程序再赋这个目录的权限,到时候你会哭。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/427945

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX