温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2020-06-03 02:29:05 来源:网络 阅读:6751 作者:John966 栏目:编程语言

    需求: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-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运行结果

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

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

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


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

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

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI