利用python 实现快速插入300万行数据

需求:mysql怎么快速插入300万行数据?(效率要高)

分析:(1)使用pymysql多行插入(提高效率)

        (2)使用python协程(遇到I/O操作就切换任务,无需等待--提高效率)

写代码之前的准备工作:

创建db20数据库,创建userinfo表

mysql> create database db20;
Query OK, 1 row affected (0.00 sec)

mysql> use db20;
Database changed

mysql> create table userinfo(id int primary key auto_increment,name varchar(20),gender varchar(6),email varchar(40)); 
Query OK, 0 rows affected (0.05 sec)

mysql> desc userinfo;
+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| id     | int(11)     | NO   | PRI | NULL    | auto_increment |
| name   | varchar(20) | YES  |     | NULL    |                |
| gender | varchar(6)  | YES  |     | NULL    |                |
| email  | varchar(40) | YES  |     | NULL    |                |
+--------+-------------+------+-----+---------+----------------+4 rows in set (0.03 sec)

pymysql代码

#!/usr/bin/env python# coding: utf-8import pymysqlimport geventimport timeclass MyPyMysql:    def __init__(self, host, port, username, password, db, charset='utf8'):        self.host = host          # mysql主机地址        self.port = port          # mysql端口        self.username = username  # mysql远程连接用户名        self.password = password  # mysql远程连接密码        self.db = db              # mysql使用的数据库名        self.charset = charset    # mysql使用的字符编码,默认为utf8        self.pymysql_connect()    # __init__初始化之后,执行的函数    def pymysql_connect(self):        # pymysql连接mysql数据库        # 需要的参数host,port,user,password,db,charset        self.conn = pymysql.connect(host=self.host,
                                    port=self.port,
                                    user=self.username,
                                    password=self.password,
                                    db=self.db,
                                    charset=self.charset
                               )
        # 连接mysql后执行的函数        self.asynchronous()

    def run(self, nmin, nmax):        # 创建游标        self.cur = self.conn.cursor()
        
        # 定义sql语句,插入数据id,name,gender,email        sql = "insert into userinfo(id,name,gender,email) values (%s,%s,%s,%s)"        # 定义总插入行数为一个空列表        data_list = []
        for i in range(nmin, nmax):
            # 添加所有任务到总的任务列表            result = (i, 'zhangsan' + str(i), 'male', 'zhangsan' + str(i) + '@qq.com')
            data_list.append(result)
            
        # 执行多行插入,executemany(sql语句,数据(需一个元组类型))        content = self.cur.executemany(sql, data_list)
        if content:
             print('成功插入第{}条数据'.format(nmax-1))
            
        # 提交数据,必须提交,不然数据不会保存        self.conn.commit()

    def asynchronous(self):        # g_l 任务列表        # 定义了异步的函数: 这里用到了一个gevent.spawn方法        max_line = 10000  # 定义每次最大插入行数(max_line=10000,即一次插入10000行)        g_l = [gevent.spawn(self.run, i, i+max_line) for i in range(1, 3000001, max_line)]

        # gevent.joinall 等待所以操作都执行完毕        gevent.joinall(g_l)
        self.cur.close()  # 关闭游标        self.conn.close()  # 关闭pymysql连接if __name__ == '__main__':
    start_time = time.time()  # 计算程序开始时间    st = MyPyMysql('192.168.11.102', 3306, 'py123', 'py123', 'db20')  # 实例化类,传入必要参数    print('程序耗时{:.2f}'.format(time.time() - start_time))  # 计算程序总耗时

pycharm运行结果

以防万一,在mysql里面看看:

mysql> select count(1) from userinfo;
+----------+
| count(1) |
+----------+
|  3000000 |
+----------+1 row in set (0.78 sec)

300万条数据不多不少,耗时87秒!

欢迎大家一起玩好PY,一起交流:QQ群:198447500

原文地址:http://blog.51cto.com/haowen/2139510

时间: 2024-10-12 08:07:46

利用python 实现快速插入300万行数据的相关文章

利用Python实现爬去彩票网站数据——小样

写这篇文章纯属自娱自乐. 主要是近期在自学如何利用Python解决IT运维的一些问题时,总是不得其门而入,为了增加学习兴趣,就想通过完成一个小小有趣的爬虫程序激励下自己,同时也把这次经历跟各位道友分享下. Technorati Tags: Python,爬网,彩票,数据,夏明亮 首先申明,本人不是专职coding的,所以,代码部分如果不符合专业审美,还请多多包涵:俺就是纯粹以实习那目标为基础的小白一枚:思路为先,抛砖引玉~ 步骤一:利用搜索引擎找到你需要的信息的网页资源 1. 打开百度搜索"彩票

SqlServer快速插入百万条数据——表值参数

begin tran       insert into test(vid,v)       select vid,v       from test   commit  tran go该方法插入20W条数据,仅耗时6.5s,比传统的循环insert into快不知道多少倍- - 原文地址:https://www.cnblogs.com/4job/p/11442413.html

利用python爬取58同城简历数据

最近接到一个工作,需要获取58同城上面的简历信息(http://gz.58.com/qzyewu/).最开始想到是用python里面的scrapy框架制作爬虫.但是在制作的时候,发现内容不能被存储在本地变量 response 中.当我通过shell载入网页后,虽然内容能被储存在response中,用xpath对我需要的数据进行获取时,返回的都是空值.考虑到数据都在源码中,于是我使用python里的beautifulSoup通过下载源码的方式去获取数据,然后插入到数据库. 需要的python包ur

《利用python进行数据分析》读书笔记--数据加载、存储与文件格式

输入输出一般分为下面几类:读取文本文件和其他更高效的磁盘存储格式,加载数据库中的数据.利用Web API操作网络资源. 1.读写文本格式的数据 自己感觉读写文件有时候"需要运气",经常需要手工调整.因为其简单的文件交互语法.直观的数据结构,以及诸如元组打包解包之类的便利功能,Python在文本和文件处理方面已经成为一门招人喜欢的语言.pandas提供了一些用于将表格型数据读取为DataFrame对象的函数.见下表: 下面大致介绍一下这些函数在文本数据转换为DataFrame时的一些技术

面面观 | 使用python 连接数据库,插入并查询数据--link

1,将两个docker 连接起来 首先需要搭建环境: 在alpine下面创建mariadb数据库: http://blog.csdn.net/freewebsys/article/details/53540615 用户名密码是root. 然后创建http的Python环境: http://blog.csdn.net/freewebsys/article/details/53509676 接下来做一个简单数据查询和插入操作. 2,python代码: main.py #!/usr/bin/pytho

利用Python来爬取“吃鸡”数据,为什么别人能吃鸡?

首先,神装镇楼背景 最近老板爱上了吃鸡(手游:全军出击),经常拉着我们开黑,只能放弃午休的时间,陪老板在沙漠里奔波. 上周在在微信游戏频道看战绩的时候突发奇想,是不是可以通过这个方式抓取到很多战斗数据,然后分析看看有什么规律.秀一波战绩,开黑情况下我们团队吃鸡率非常高,近100场吃鸡次数51次简单评估了一下,觉得可行,咱就开始. Step 1 分析数据接口 第一步当然是把这些战绩数据采集下来,首先我们需要了解页面背后的故事.去看看页面是如何获取战斗数据的. 使用Charles抓包 抓包实现 在M

Asp.net中利用NPOI组件快速导入导出Execl数据

相信很多童鞋都开发过Execl的导入导出功能,最近产品中无论是后台数据分析的需要,还是前端满足用户管理的方便,都有Execl导入导出的维护需求产生. 以前做这个功能,如果是web,利用HttpContext.Current.Response.ContentType ="application/ms-excel";就可以导出html数据表格到execl中,这种方法的问题就是编码格式的兼容性太差,用Mac OS之类的 office打开直接乱码给你看.或者是调用office的COM组件,或宏

利用python进行泰坦尼克生存预测——数据探索分析

最近一直断断续续的做这个泰坦尼克生存预测模型的练习,这个kaggle的竞赛题,网上有很多人都分享过,而且都很成熟,也有些写的非常详细,我主要是在牛人们的基础上,按照数据挖掘流程梳理思路,然后通过练习每一步来熟悉应用python进行数据挖掘的方式. 数据挖掘的一般过程是:数据预览-->数据预处理(缺失值.离散值等)-->变量转换(构造新的衍生变量)-->数据探索(提取特征)-->训练-->调优-->验证 1 数据预览 1.1 head() 预览数据集的前面几条数据可以大致

利用Python批量抓取京东评论数据

京东图书评论有非常丰富的信息,这里面就包含了购买日期.书名.作者.好评.中评.差评等等.以购买日期为例,使用Python + Mysql的搭配进行实现,程序不大,才100行.相关的解释我都在程序里加注了: 1 from selenium import webdriver 2 from bs4 import BeautifulSoup 3 import re 4 import win32com.client 5 import threading,time 6 import MySQLdb 7 8