使用Python快速导入千万数据

使用Python快速导入千万数据

  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关系对应,再批量插入新的关联关系表中

有没有更好的方法???


回答:

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

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


回答:

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


回答:

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


回答:

第一步:导出数据到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%

以上是 使用Python快速导入千万数据 的全部内容, 来源链接: utcz.com/p/937610.html

回到顶部