利用python 实现快速插入300万行数据
需求:mysql怎么快速插入300万行数据?(效率要高)
分析:(1)使用pymysql多行插入(提高效率)
(2)使用python协程(遇到I/O操作就切换任务,无需等待--提高效率)
写代码之前的准备工作:
创建db20数据库,创建userinfo表
mysql>createdatabasedb20;QueryOK,1rowaffected(0.00sec)mysql>usedb20;Databasechangedmysql>createtableuserinfo(idintprimarykeyauto_increment,namevarchar(20),gendervarchar(6),emailvarchar(40));QueryOK,0rowsaffected(0.05sec)mysql>descuserinfo;+--------+-------------+------+-----+---------+----------------+|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||+--------+-------------+------+-----+---------+----------------+4rowsinset(0.03sec)
pymysql代码
#!/usr/bin/envpython#coding:utf-8##技术交流QQ群:198447500###说明:该代码仅限python学习研究使用,请谨慎复制粘贴直接使用,一定要懂哈。importpymysqlimportgeventimporttimeclassMyPyMysql: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使用的字符编码,默认为utf8self.pymysql_connect()#__init__初始化之后,执行的函数defpymysql_connect(self):#pymysql连接mysql数据库#需要的参数host,port,user,password,db,charsetself.conn=pymysql.connect(host=self.host,port=self.port,user=self.username,password=self.password,db=self.db,charset=self.charset)#连接mysql后执行的函数self.asynchronous()defrun(self,nmin,nmax):#创建游标self.cur=self.conn.cursor()#定义sql语句,插入数据id,name,gender,emailsql="insertintouserinfo(id,name,gender,email)values(%s,%s,%s,%s)"#定义总插入行数为一个空列表data_list=[]foriinrange(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)ifcontent:print('成功插入第{}条数据'.format(nmax-1))#提交数据,必须提交,不然数据不会保存self.conn.commit()defasynchronous(self):#g_l任务列表#定义了异步的函数:这里用到了一个gevent.spawn方法max_line=10000#定义每次最大插入行数(max_line=10000,即一次插入10000行)g_l=[gevent.spawn(self.run,i,i+max_line)foriinrange(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>selectcount(1)fromuserinfo;+----------+|count(1)|+----------+|3000000|+----------+1rowinset(0.78sec)
300万条数据不多不少,耗时87秒!
欢迎大家一起玩好PY,一起交流:QQ群:198447500
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。