pymysql中 execute 和 executemany 性能對比,以及與原生SQL 相好比何

今天在mysql中插入大批量數據時,忽然想起pymysql 還有executemany 方法,那麼這兩個方法到底誰快?快多少?

測試環境

  • python3
  • mysql
  • pymysql

老規矩,先上測試代碼:python

class IN_sql():
    def __init__(self):
        print('初始化中...')
        self.connDB = pymysql.connect(host=DB_HOST,
                                      user=DB_USER,
                                      passwd=DB_PASSWD,
                                      db=DB_DB,
                                      charset='utf8mb4')
        self.connDB.ping()
        self.cu=self.connDB.cursor()

    def workOn(self):
        L=[]
        with open("./1W.txt","r",encoding="utf-8")as f:
            while True:
                res=f.readline().replace("\r","").replace("\n","")
                if not res:
                    break
                L.append(res)
        #統計插入所需時間
        start = time.time()
        sql = "insert ignore into article(an) values(%s);"
        
        #execute 執行代碼
        for l in L:
            self.cu.execute(sql, l)
            
        #executemany 執行代碼
        #self.cu.executemany(sql, tuple(L))
        
        self.connDB.commit()
        print('共計用時(秒):' + str(round(time.time() - start, 2)))

        self.cu.close()
        self.connDB.close()


if __name__ == '__main__':
    insert=IN_sql()
    insert.workOn()

測試結果

方法量級耗時(s) 1W 10W 100W
execute 3.126 25.139 248.022
executemany 0.1 0.981 10.854

總結

能夠看出明顯的區別,,若是須要批量插入數據庫,仍是用 executemany方法好些,這個和execute 徹底不是一個數量級!!!mysql

==最近有朋友問到,executemany 和原生SQL 語句有好多的區別?==
這裏本人又進行了測試:sql

def workOn(self):
        L=[]
        with open("./100W.txt","r",encoding="utf-8")as f:
            while True:
                res=f.readline().replace("\r","").replace("\n","")
                if not res:
                    break
                L.append(res)
        #統計插入所需時間
        start = time.time()
        print("start time:" + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(start)))
        sql = "insert into article(an) values  "
        for l in L:
            sql += "('%s'), " % l
        sql = sql.rstrip(', ') + ';'
        self.cu.execute(sql)
        self.connDB.commit()
        end=time.time()
        print("end time:"+time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(end)))
        print('共計用時(秒):' + str(round(end - start, 3)))

最終結果:20.176s數據庫

WHAT?

==爲何執行原生SQL 比executemany 還要慢啊?理論上原生SQL應該是最快的。==數組

經過查詢源碼得知,executemany實際上也是把各個參數組合成一條SQL語句執行(==insert into article(an) values (),(),(),(),(),()==),優化的地方主要是在字符串的拼接上。app

最後通過測試獲得:本人本身的代碼字符串拼接花了12s左右的時間,寫入SQL語句花了8s左右,而executemany 字符串拼接僅花了2s左右。測試

因此,小夥伴們之後遇到大批量數據寫入時儘可能使用executemany 方法吧!優化

相關文章
相關標籤/搜索