利用python 实现快速插入300万行数据
admin
2023-07-24 08:41:51
0

    需求: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

相关内容

热门资讯

相比高考590分,那个扛起被褥... 6月26日,“扛被褥出考场的贵州女孩考了590分”上了热搜。“扛得起被褥,也扛得起未来。”一则跟帖引...
天下苦话费贵久矣 “刚申请销户,套餐立刻便宜50元;坚持要销户,又便宜50元。”家住深圳的向生(化名),用了四年中国电...
网传济宁“某商城火锅店艾滋病人... 6月25日,一则关于“我市某区一商城内自助小火锅店有艾滋病患者在餐具内故意留下血迹,且疾控中心控制6...
冰箱恒温不制冷是什么原因造成的 原因可能是冰箱内一次性放入了太多东西,东西太多有可能堵住冰箱的进风口和出风口,冰箱内的冷空气不能循环...
冰箱压缩机不启动是什么原因造成... 1、可以看看是不是因为电源线路接触不良,磨损,松动的现象,从而出现了短路的,或者是此台冰箱的年限太长...
半自动洗衣机电机不转是什么原因 1、可能是插座板的接触不良引起的。2、可能是电机本身出现了故障问题,或者是其它的零件出现了问题,比如...
空调内机喷水是什么原因造成的 出现此类问题首先可以考虑是因为空调的挡水板老化变形或者是松动脱落造成的,还可以考虑是空调冷凝器破裂导...
空调打不开是什么原因造成的 首先可能是空调电源插座没有电,需要重新连接;如果电源正常,遥控器打不开的话,需要更换遥控器;可以通过...
特斯拉宣布为员工子女设立奖学金... 6月26日,特斯拉宣布为员工子女设立奖学金,包括高等教育入学奖学金和科学素养类竞赛/论文发布奖学金,...
新加坡籍货船遭袭,伊方:不走指... 据新华社援引美国《华尔街日报》25日报道称,伊朗伊斯兰革命卫队当天在霍尔木兹海峡袭击了一艘新加坡籍货...