利用python实现快速插入300万行数据
                                            需求:MySQL怎么快速插入300万行数据?(效率要高)
成都创新互联公司专注为客户提供全方位的互联网综合服务,包含不限于做网站、网站建设、青羊网络推广、微信小程序、青羊网络营销、青羊企业策划、青羊品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;成都创新互联公司为所有大学生创业者提供青羊建站搭建服务,24小时服务热线:13518219792,官方网址:www.cdcxhl.com
分析:(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-8
##技术交流 QQ群:198447500
###说明:该代码仅限python学习研究使用,请谨慎复制粘贴直接使用,一定要懂哈。
import pymysql
import gevent
import time
class 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
本文题目:利用python实现快速插入300万行数据
本文URL:http://www.scyingshan.cn/article/pggghe.html

 建站
建站
 咨询
咨询 售后
售后
 建站咨询
建站咨询 
 