Python進階(三十一)-往MySQL數據庫里添加數據,update和insert哪個效率高
#Python進階(三十一)-往MySql數據庫里添加數據,update和insert哪個效率高
在編寫“Water Spider”過程中,遇到了批量更新數據的情況。自己剛開始時想使用mysql提供的cursor.executemany(operation, seq_of_params)方法執行批量更新操作,但是在寫sql語句時遇到了問題,不知道如何寫了。
后來換種思路,考慮在執行數據插入之前先做數據表刪除操作,然后再執行寫入操作。因為自己臆想的是“數據插入的效率應該優于更細的效率。”因此,決定對于該問題進行實際考察。
下面總結一下網絡上針對該問題大家給出的觀點
1. “不考慮主鍵變動,索引變動,觸發器聯動的情況下,update比Insert效率高。”
2. 這個很難說,相關因素太多了:存儲引擎類型、是否加索引(索引結構如B+樹索引或者哈希索引、索引更新、聚集索引還是非聚集索引)、約束(如唯一性約束、外鍵約束等)…
還有提下三種插入語句(也有可能影響插入速度,從而難以判斷插入快還是更新快):
MySQL中常用的三種插入數據的語句:
insert into表示插入數據,數據庫會檢查主鍵,如果出現重復會報錯;
replace into表示插入替換數據,需求表中有Primary
Key,或者唯一索引,如果表中已經存在數據,則用新數據替換,如果沒有數據效果則和insert into一樣;
insert ignore表示,如果表中如果已經存在相同的記錄,則忽略當前新數據。
SQL中插入一個記錄需要的時間由下列因素組成,其中的數字表示大約比例:
連接:(3)
發送查詢給服務器:(2)
分析查詢:(2)
插入記錄:(1x記錄大小)
插入索引:(1x索引)
關閉:(1)
如果我們每插入一條都執行一個SQL語句,那么我們需要執行除了連接和關閉之外的所有步驟N次,這樣是非常耗時的,優化的方式有一下幾種:
在每個insert語句中寫入多行,批量插入
將所有查詢語句寫入事務中
利用Load Data導入數據
每種方式執行的性能如下。
##Innodb引擎
InnoDB 給 MySQL 提供了具有事務(commit)、回滾(rollback)和崩潰修復能力(crash recovery capabilities)的事務安全(transaction-safe (ACID compliant))型表。InnoDB 提供了行鎖(locking on row level)以及外鍵約束(FOREIGN KEY constraints)。
InnoDB 的設計目標是處理大容量數據庫系統,它的 CPU 利用率是其它基于磁盤的關系數據庫引擎所不能比的。在技術上,InnoDB 是一套放在 MySQL 后臺的完整數據庫系統,InnoDB 在主內存中建立其專用的緩沖池用于高速緩沖數據和索引。
對于這種大數據量的更新情況,可以采用多線程的方式,每個線程更新100條數據,這樣就能提高更新的速度了。
當然這里的100只是一個猜想值,哪個值合適,需要你測試才能得出。我想的話,應該能比單線要快些,至于能不能優化到2s,這個就不清楚了。
同時需要注意你的連接池大小、線程池大小(核心線程數)。這些資源也會影響到你的更新速度(即這些資源不能出現競爭)
最后,我對你需要更新這么大的數據量操作有一些疑問:
這個操作是online的嗎?
這個操作的返回是實時的嗎?
對于大數據量的更新一般會做成一個異步的操作,而不需要是實時的。

MySQL Python 數據庫
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。