使用Python快速导入千万数据
- 面临的问题
旧表(sqlserver)中有1500万条用数据,需要快速导入到新表(mysql)中
时间控制在2小时以内
用户数据有关联关系表2张,导入新表后,之前的用户id已新表的主键为新的用户Uid需要在这个时间内,将3张表(共4500万数据)导入到mysql中
- 开发语言及ORM选择
Python 3.6.5
SQLAlchemy 1.3.3 初步想法
- 单次查询1000条数据
- 通过SQLAlchemy提供的bulk_insert_mappings方法批量插入用户表
- 关联表的数据,需要查一次新表的数据,将旧uid与新表的uid关系对应,再批量插入新的关联关系表中
有没有更好的方法???
回答:
如果考虑不影响线上业务的前提下:
- 拷贝需要导出的表,还是放在 sqlserver 中,记得重命名。操作拷贝的表
- 如果导出过程有数据整理,推荐是用 pandas(可以按照列操作),最后可以直接 to_sql 到数据库。但要考虑加载数据量,建议 10 万一批。
- 最后数据处理完后,对比数据,确认数据是否导出完整,补全在导出时缺失的部分数据。
回答:
为什么一定要用语言相关的实现?直接使用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