需求:mysql怎么快速插入300萬行數(shù)據(jù)?(效率要高)

分析:(1)使用pymysql多行插入(提高效率)
(2)使用python協(xié)程(遇到I/O操作就切換任務(wù),無需等待--提高效率)
寫代碼之前的準(zhǔn)備工作:
創(chuàng)建db20數(shù)據(jù)庫,創(chuàng)建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
##技術(shù)交流 QQ群:198447500
###說明:該代碼僅限python學(xué)習(xí)研究使用,請謹(jǐn)慎復(fù)制粘貼直接使用,一定要懂哈。
import pymysql
import gevent
import time
class MyPyMysql:
def __init__(self, host, port, username, password, db, charset='utf8'):
self.host = host # mysql主機(jī)地址
self.port = port # mysql端口
self.username = username # mysql遠(yuǎn)程連接用戶名
self.password = password # mysql遠(yuǎn)程連接密碼
self.db = db # mysql使用的數(shù)據(jù)庫名
self.charset = charset # mysql使用的字符編碼,默認(rèn)為utf8
self.pymysql_connect() # __init__初始化之后,執(zhí)行的函數(shù)
def pymysql_connect(self):
# pymysql連接mysql數(shù)據(jù)庫
# 需要的參數(shù)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后執(zhí)行的函數(shù)
self.asynchronous()
def run(self, nmin, nmax):
# 創(chuàng)建游標(biāo)
self.cur = self.conn.cursor()
# 定義sql語句,插入數(shù)據(jù)id,name,gender,email
sql = "insert into userinfo(id,name,gender,email) values (%s,%s,%s,%s)"
# 定義總插入行數(shù)為一個(gè)空列表
data_list = []
for i in range(nmin, nmax):
# 添加所有任務(wù)到總的任務(wù)列表
result = (i, 'zhangsan' + str(i), 'male', 'zhangsan' + str(i) + '@qq.com')
data_list.append(result)
# 執(zhí)行多行插入,executemany(sql語句,數(shù)據(jù)(需一個(gè)元組類型))
content = self.cur.executemany(sql, data_list)
if content:
print('成功插入第{}條數(shù)據(jù)'.format(nmax-1))
# 提交數(shù)據(jù),必須提交,不然數(shù)據(jù)不會保存
self.conn.commit()
def asynchronous(self):
# g_l 任務(wù)列表
# 定義了異步的函數(shù): 這里用到了一個(gè)gevent.spawn方法
max_line = 10000 # 定義每次大插入行數(shù)(max_line=10000,即一次插入10000行)
g_l = [gevent.spawn(self.run, i, i+max_line) for i in range(1, 3000001, max_line)]
# gevent.joinall 等待所以操作都執(zhí)行完畢
gevent.joinall(g_l)
self.cur.close() # 關(guān)閉游標(biāo)
self.conn.close() # 關(guān)閉pymysql連接
if __name__ == '__main__':
start_time = time.time() # 計(jì)算程序開始時(shí)間
st = MyPyMysql('192.168.11.102', 3306, 'py123', 'py123', 'db20') # 實(shí)例化類,傳入必要參數(shù)
print('程序耗時(shí){:.2f}'.format(time.time() - start_time)) # 計(jì)算程序總耗時(shí)pycharm運(yùn)行結(jié)果

以防萬一,在mysql里面看看:
mysql> select count(1) from userinfo; +----------+ | count(1) | +----------+ | 3000000 | +----------+1 row in set (0.78 sec)
300萬條數(shù)據(jù)不多不少,耗時(shí)87秒!
歡迎大家一起玩好PY,一起交流:QQ群:198447500
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
網(wǎng)站欄目:利用python實(shí)現(xiàn)快速插入300萬行數(shù)據(jù)-創(chuàng)新互聯(lián)
文章分享:http://www.chinadenli.net/article24/dgeece.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、商城網(wǎng)站、全網(wǎng)營銷推廣、外貿(mào)建站、App開發(fā)、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容