之前我阿湯博客寫過一篇文檔《Flask-SQLAlchemy批量插入數據性能測試》,當時對幾種批量插入Mysql數據庫的方法做了性能比較。
只要不是通過for循環一條條插入,另外幾種方法都比較快的,一萬條數據也就0.6s左右。
但是最近我在做一個通過導入Excel或者csv文件,然后把數據批量寫入數據庫功能,使用bulk_insert_mappings方法發現性能下降挺厲害。
一共7600條數據,寫入數據庫的時間要20-30s左右,字段也才十多個。
經過了五六個小時的測試,這個過程就不贅述了,更換了各種方法、各種姿勢。下面分享給大家,希望對看到這篇文章的人有幫助。
主要原因就是因為同一個字段里面同時存在str和None的原因導致。
因為導入文件里面有幾列時間,數據庫字段datetime類型不允許插入空值,所以我把文件里面時間字段空值都替換成了None,然后就出現了插入數據庫性能下降的問題。
如果全部為str或者全部為None寫入性能沒有影響。
解決方案就是要么更改數據庫字段datetime類似為varchar,或者文件時間為空時給一個默認時間,不要替換為None。
最后測試寫入7600條數據到MySQL基本耗時在1-2s。