Python 基于Python从mysql表读取千万数据实践
基于Python 从mysql表读取千万数据实践
by:授客 QQ:1033553122
场景:
有以下两个表,两者都有一个表字段,名为waybill_no,我们需要从tl_waybill_bar_record表读取1000w条唯一的waybill_no,然后作为INSERT SQL语句的一部分,填充到ts_order_waybill的waybill_no字段中
tl_waybill_bar_record
ts_order_waybill
另外tl_waybill_bar_record表waybill_no有部分重复
实现思路
思路1、利用MySql的LIMIT offset, length分页功能+ORDER BY primary_key按主键排序,循环读取数据,然后解析读取的数据,直到满足条件停止
例子:按5000条记录进行分页,循环2000000,从第0条记录开始,按seq_id主键升序排序,每次从不同的分页读取5000条记录
for i in range(0, 2000000):
query = "SELECT waybill_no, seq_id FROM ts_order_waybill ORDER BY seq_id LIMIT '%s', 5000" % str(i*5000)
result = test_platform_db.select_many_record(query)
……(后续处理)
说明:这种方式,有一定的局限性,分页数量似乎会受限制,似乎只能8000多页,另外当offset达一定值(55w)的样子,似乎会变得很卡,数据量较少的情况下,可以考虑这么做
注意:这里如果不适用ORDER BY语句,可能在不同分页取数据时,会取到重复的数据
思路2、先SELECT MIN(primary_key) 查询最小主键值key_min_value,然后每次查询时加WHERE primary_key>=key_min_value,并且加ORDER BY primary_key按主键升序排序,同时使用LIMIT length限制每次返回数据量大小
min_seq_id = '18e23705987643f9b84cd8c4c3efc47868944d88cb71480ea4b7659d2c9c6cba'
for i in range(0, 2000000):
query = SELECT waybill_no, seq_id FROM ts_order_waybill WHERE seq_id>='%s' ORDER BY seq_id LIMIT 5000" % min_seq_id
result = test_platform_db.select_many_record(query)
……(后续处理)
问题
跑程序的时候,经常会突然“卡死”,可能是Python 类库自身原因,也可能是数据库请求过于频繁,这样会导致获取的结果丢失,需要重头开始跑
解决方法:
一边跑,一边写入本地文件,同时输出上次读取的记录的位置(思路2来说,就是那个最小主键值),然后重新跑程序时,替换下初始值即可。
关键代码
test_db = MyDB('MYDB')
file_handler = open('./result/waybill_no.txt', 'r+', encoding='utf-8')
waybill_no_set = set() # 用于存储获取的waybill_no
# 读取上次获取的数据
line = file_handler.readline()
line = line.strip() # 去掉换行符
while line:
waybill_no_set.add(line)
line = file_handler.readline()
line = line.strip()
# 初始最小主键值
min_seq_id = '18e23705987643f9b84cd8c4c3efc47868944d88cb71480ea4b7659d2c9c6cba'
count = len(waybill_no_set) # 初始化以读取的waybill_no总数
for i in range(0, 2000000):
query = "SELECT waybill_no,seq_id FROM ts_order_waybill WHERE seq_id>='%s' ORDER BY seq_id LIMIT 5000" % min_seq_id
result = test_db.select_many_record(query)
if result[0] and result[1]:
for item in result[1]:
waybill_no = item[0]
if waybill_no not in waybill_no_set:
waybill_no_set.add(waybill_no)
min_seq_id = item[1]
count += 1
print(count)
print(min_seq_id) # 记录上次读取的“最后位置”
file_handler.write(waybill_no)
file_handler.write('\n')
file_handler.flush()
print('已获取waybill_no总数:', count)
if count > 10000000:
break
# 插入数据
for waybill_no in waybill_no_set:
time.sleep(0.1)
insert_sql = "insert into `tl_waybill_bar_record` (`waybill_no`, `op_code`, `bar_Scan_Tm`, `ows_remark`, `stay_why_code`, `extend_attach1`, `extend_attach2`, `extend_attach3`, `extend_attach4`, `extend_attach5`, `op_name`, `dist_name`, `outside_name`, `old_waybill_no`, `courier_code`, `stay_why_name`, `create_time`) " \
"values('%s','31','2018-05-09 20:02:33','广州市',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'2018-05-05 15:56:09');" % waybill_no
test_db.execute_insert(insert_sql, '')
count = count + 1
print(waybill_no)
print(count)
Python 基于Python从mysql表读取千万数据实践的更多相关文章
- Python 基于Python实现的ssh兼sftp客户端(上)
基于Python实现的ssh兼sftp客户端 by:授客 QQ:1033553122 实现功能 实现ssh客户端兼ftp客户端:实现远程连接,执行linux命令,上传下载文件 测试环境 Win7 ...
- php实例根据ID删除mysql表中的数据
在动态网站开发中,我们经常要根据ID删除表中的数据,例如用户删除帖子,就需要根据ID删除帖子.本文章向大家介绍php根据ID删除表中数据的实例,需要的朋友可以参考一下本文章的实例. php实例根据ID ...
- Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理
基于python+mysql浅谈redis缓存设计与数据库关联数据处理 by:授客 QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3 ...
- Python 基于Python及zookeeper实现简单分布式任务调度系统设计思路及核心代码实现
基于Python及zookeeper实现简单分布式任务调度系统设计思路及核心代码实现 by:授客 QQ:1033553122 测试环境 功能需求 实现思路 代码实践(关键技术点实现) 代码模块组织 ...
- Python 基于python操纵zookeeper介绍
基于python操纵zookeeper介绍 by:授客 QQ:1033553122 测试环境 Win7 64位 Python 3.3.4 kazoo-2.6.1-py2.py3-none-any.w ...
- Python 基于python实现的http+json协议接口自动化测试框架源码(实用改进版)
目录 1. 写在前面 2. 开发环境 3. 大致流程 4. 框架简介 5. 运行结果展示 6. 文件与配置 7. 测试接口实例 n ...
- Python 基于Python结合pykafka实现kafka生产及消费速率&主题分区偏移实时监控
基于Python结合pykafka实现kafka生产及消费速率&主题分区偏移实时监控 By: 授客 QQ:1033553122 1.测试环境 python 3.4 zookeeper- ...
- Python 基于Python实现的ssh兼sftp客户端(下)
基于Python实现的ssh兼sftp客户端 by:授客 QQ:1033553122 otherTools.py #!/usr/bin/env/ python # -*- coding:utf-8 ...
- Python基于Python实现批量上传文件或目录到不同的Linux服务器
基于Python实现批量上传文件或目录到不同的Linux服务器 by:授客 QQ:1033553122 实现功能 1 测试环境 1 使用方法 1 1. 编辑配置文件conf/rootpath_fo ...
随机推荐
- feh: linux终端下看图片的好工具
1) 普通浏览 $ feh * 可以察看当前目录下的所有图片,以及当前子目录里的所有图片 2) 播放幻灯片 (-D) $ feh -D 2 *.jpg 对所有jpg以幻灯片的方式播放,每两秒放一张 ...
- Python中的算数运算
算数运算符 计算机,顾名思义就是负责进行 数学计算 并且 存储计算结果 的电子设备 目标 算术运算符的基本使用 01. 算数运算符 算数运算符是 运算符的一种 是完成基本的算术运算使用的符号,用来处理 ...
- JS获取链接中域名等信息
以访问百度为例子http://pan.baidu.com/share/qrcode?w=150&h=150&url=http%3A%2F%2F172.16.1.96%2FWeb%2FG ...
- 【shiro】(5)---基于Shiro的权限管理
基于Shiro的权限管理项目搭建 前面写了四篇有关权限的文章,算是这篇文章的铺垫了.这篇文章采用 开发环境 JDK1.8 Eclipse Mav ...
- yum安装Elasticsearch5.x
这里演示YUM和RPM两种方式安装Elasticsearch 下载并安装 public signing key: rpm --import https://artifacts.elastic.co/G ...
- 好用的shell可以事半功倍
程序员离不开shell,一个好用的shell可以事半功倍,推荐zsh以及一些插件 # install zsh $ brew install zsh # install a framework, we ...
- 纸上谈兵: AVL树[转]
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 二叉搜索树的深度与搜索效率 我们在树, 二叉树, 二叉搜索树中提到,一个有n个节点 ...
- 详解Maven用户的配置settings.xml
Maven用户设置 作者其他技术文章 1)Oracle性能优化之查询语句通用原则 2)Redis常用命令 3) SpringCloud入门之常用的配置文件 application.yml和 boots ...
- WEB安全之垃圾信息防御措施
防止垃圾评论与机器人的攻击手段如下: 1)IP限制.其原理在于IP难以伪造.即使是对于拨号用户,虽然IP可变,但这也会大大增加共攻击的工作量. 2)验证码.其重点是让验证码难于识别,对于“字母+数字” ...
- 三大主流软件负载均衡器对比(LVS VS Nginx VS Haproxy)
LVS:1.抗负载能力强.抗负载能力强.性能高,能达到F5硬件的60%:对内存和cpu资源消耗比较低2.工作在网络4层,通过vrrp协议转发(仅作分发之用),具体的流量由linux内核处理,因此没有流 ...