之前我阿汤博客写过一篇文档《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。