使用Python快速导入千万数据

发布于 2022-09-11 21:23:52 字数 430 浏览 19 评论 0

  1. 面临的问题
    旧表(sqlserver)中有1500万条用数据,需要快速导入到新表(mysql)中
    时间控制在2小时以内
    用户数据有关联关系表2张,导入新表后,之前的用户id已新表的主键为新的用户Uid

    需要在这个时间内,将3张表(共4500万数据)导入到mysql中

  2. 开发语言及ORM选择
    Python 3.6.5
    SQLAlchemy 1.3.3
  3. 初步想法

    1. 单次查询1000条数据
    2. 通过SQLAlchemy提供的bulk_insert_mappings方法批量插入用户表
    3. 关联表的数据,需要查一次新表的数据,将旧uid与新表的uid关系对应,再批量插入新的关联关系表中
有没有更好的方法???

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

乄_柒ぐ汐 2022-09-18 21:23:52

如果考虑不影响线上业务的前提下:

  1. 拷贝需要导出的表,还是放在 sqlserver 中,记得重命名。操作拷贝的表
  2. 如果导出过程有数据整理,推荐是用 pandas(可以按照列操作),最后可以直接 to_sql 到数据库。但要考虑加载数据量,建议 10 万一批。
  3. 最后数据处理完后,对比数据,确认数据是否导出完整,补全在导出时缺失的部分数据。
尬尬 2022-09-18 21:23:52

为什么一定要用语言相关的实现?直接使用mysql的load data也行啊

☆獨立☆ 2022-09-18 21:23:52

换个思路,写代码从sqlserver导出到mysql格式的4500万行的sql文件,再source data.sql导入mysql,一拆你就只需要去考虑导出的性能,不用考虑导入的性能

自在安然 2022-09-18 21:23:52

第一步:导出数据到csv文件,保存到多个文件,比如150w一个csv,这样就是30个csv文件
第二步:按照文件个数开多线程导入mysql,怎么导入?

最推荐:mysql的load data将csv导入mysql,但是线上一般为了安全不会开启使用这个功能的参数,需要配置secure_file_priv = ''
备份方案:用python多线程读取csv,拼接成insert插入mysql

根据你的描述需要对数据做一些逻辑处理,那就需要用第二个方案了,建议并发处理的之前先对mysql参数进行调优,比如关闭双1,加大缓冲池等等

关闭双一:
innodb_flush_log_at_trx_commit = 0
sync_binlog = 0
加大缓冲池:
innodb_buffer_pool_size = 内存的75%

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文