我最近遇到一个导入Excel表中数据到数据库的需求,数据量一万多条。需先查询数据库中是否存在要插入的数据,若存在则更新数据,否则插入数据。我首先按照常规思路先查询,然后插入或更新。然而nginx返回 504 time out 错误。显然,数据库操作消耗了太多的时间。经测试,该操作消耗了300多秒时间。
显然,数据库需要做一些优化。我首先想到给要查询的字段加索引。经测试加索引后测试,完成一次操作耗时50秒左右,勉强可以接受。将代码部署到服务器测试发现耗时高达200秒左右。
在数据库操作中,时间很大一部分消耗在了数据库链接,提交等操作上。尽量减少这些操作,能在很大程度上提高数据库操作的执行效率。
我首先想到批量插入数据,通过一次性插入若干条数据。减少不必要的操作,达到节约时间的目的。
然后我就想,能不能做到批量更新数据呢?我们知道Mysql并没有提供原生的批量更新方法。但并不意味没有方法能实现。在网上我找到下面这种方法
UPDATE mytable
SET myfield = CASE other_field
WHEN 1 THEN 'value'
WHEN 2 THEN 'value'
WHEN 3 THEN 'value'
END
WHERE id IN (1,2,3)
我通过字符串拼接的方法,一次对30条数据执行更新操作。经测试,执行时间达到14秒。部署到服务器测试,21秒也完成了操作。
本方法亲测可用,就是拼接字符串有点麻烦。希望对你有所帮助。