基于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表读取千万数据实践的更多相关文章

  1. Python 基于Python实现的ssh兼sftp客户端(上)

    基于Python实现的ssh兼sftp客户端   by:授客 QQ:1033553122 实现功能 实现ssh客户端兼ftp客户端:实现远程连接,执行linux命令,上传下载文件 测试环境 Win7 ...

  2. php实例根据ID删除mysql表中的数据

    在动态网站开发中,我们经常要根据ID删除表中的数据,例如用户删除帖子,就需要根据ID删除帖子.本文章向大家介绍php根据ID删除表中数据的实例,需要的朋友可以参考一下本文章的实例. php实例根据ID ...

  3. Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理

    基于python+mysql浅谈redis缓存设计与数据库关联数据处理 by:授客  QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3 ...

  4. Python 基于Python及zookeeper实现简单分布式任务调度系统设计思路及核心代码实现

    基于Python及zookeeper实现简单分布式任务调度系统设计思路及核心代码实现   by:授客 QQ:1033553122 测试环境 功能需求 实现思路 代码实践(关键技术点实现) 代码模块组织 ...

  5. Python 基于python操纵zookeeper介绍

    基于python操纵zookeeper介绍 by:授客  QQ:1033553122 测试环境 Win7 64位 Python 3.3.4 kazoo-2.6.1-py2.py3-none-any.w ...

  6. Python 基于python实现的http+json协议接口自动化测试框架源码(实用改进版)

    目录 1.      写在前面 2.      开发环境 3.      大致流程 4.      框架简介 5.      运行结果展示 6.      文件与配置 7.      测试接口实例 n ...

  7. Python 基于Python结合pykafka实现kafka生产及消费速率&主题分区偏移实时监控

    基于Python结合pykafka实现kafka生产及消费速率&主题分区偏移实时监控   By: 授客 QQ:1033553122   1.测试环境 python 3.4 zookeeper- ...

  8. Python 基于Python实现的ssh兼sftp客户端(下)

    基于Python实现的ssh兼sftp客户端   by:授客 QQ:1033553122 otherTools.py #!/usr/bin/env/ python # -*- coding:utf-8 ...

  9. Python基于Python实现批量上传文件或目录到不同的Linux服务器

    基于Python实现批量上传文件或目录到不同的Linux服务器   by:授客 QQ:1033553122 实现功能 1 测试环境 1 使用方法 1 1. 编辑配置文件conf/rootpath_fo ...

随机推荐

  1. ubuntu下opencv的版本切换及遇到的问题解决

    默认使用opencv 3.2的时候,使用SVM的时候,系统报错如下: error: ‘class MySVM’ has no member named ‘decision_func’ 解决方法:要把系 ...

  2. 金九银十,史上最强 Java 面试题整理。

    以下会重新整理所有 Java 系列面试题答案.及各大互联网公司的面试经验,会从以下几个方面汇总,本文会长期更新. Java 面试篇 史上最全 Java 面试题,带全部答案 史上最全 69 道 Spri ...

  3. Python编程Day7——字符编码、字符与字节、文件操作

    一.字符编码 重点 ***** 1. 什么是字符编码:将人识别的字符转换计算机能识别的01,转换的规则就是字符编码表2. 常用的编码表:ascii.unicode.GBK.Shift_JIS.Euc- ...

  4. Android--多线程之进程与线程

    前言 对于Android程序中,使用多线程的技术是必不可少的,就拿之前最简单的例子来说明,对于Android4.0+的应用而言,访问网络必须另起线程才可以访问.本片博客介绍Android下进程和线程, ...

  5. 提升 PLSQL 开发性能漫谈

    本文内容摘自<剑破冰山--Oracle开发艺术>一书,有删改. 1.触发器尽量考虑内部代码过程封装(解析次数) 2.避免动态 SQL 动态 SQL 和普通 SQL 在执行过程中最大的差别在 ...

  6. linux 命令 — sed

    sed stream editor,流编辑器 查找替换 sed 's/pattern/replace_string/' file 替换每一行第一次出现的pattern,将替换后的文本输出到stdout ...

  7. 网络编程第三讲UDP编写

    网络编程第三讲UDP编写 一丶UDP简介 UDP是面向无连接的.就是说数据传输会丢掉.网络延时比较大的情况下.会早上丢包.例如视频通话.就是UDP UDP不需要建立建立. 下面有UDP编写流程图 下图 ...

  8. 【杂谈】没有公网IP的电脑如何与外部通信

    前言 前几天突然想到的问题,自己先猜测推理了一番,最后在谢希仁版<计算机网络>找到了权威的解答.这里记录一下自己的思考过程. 网站是如何找到我们的? 我们知道,互联网中的两台电脑要进行通信 ...

  9. Maven三种仓库的配置

    转自:https://www.cnblogs.com/jack1995/p/6925879.html Maven三种仓库的配置 1 本地仓库的配置 在第一篇中我们介绍过,Maven的仓库有三类,这里不 ...

  10. OJ:自己实现一个简单的 priority_queue

    Description 补足程序,使得下面程序输出结果是: 1.8 2.4 3.8 4.9 8.8 #include <iostream> #include <algorithm&g ...