将mysql_pool替换为require('mysql2/promise'),并单独在每个需要连接的方法中获取连接。在query、execute和prepare方法中分别使用获取到的连接进行操作。使用prepare方法编译预处理SQL语句,通过for循环将数据分批处理并提交事务。在每个事务方法最后加入事务回滚和释放连接的代码。经过优化,处理1.5万条数据仅...
nodejs使用mysql2插件的sql预处理语句node代码发生
项目中遇到数据迁移问题,5万条数据从Redis转存至MySQL,使用HGETALL获取Redis数据,排序并提取所需属性,通过mysql.execute()循环执行SQL。初期尝试500条数据,耗时10秒;增加到1500条,时间翻倍至30秒。处理5万条数据预计耗时10-20分钟,效率低下,于是考虑优化方案。
考虑到了两种优化方式:批量SQL执行和SQL预处理。优先选择了预处理,因为对这个知识点了解不足,将其作为学习机会。在查找资料时,发现多数实例针对单条数据,MySQL2模块文档也仅提供单条数据预处理方式。目标是处理几万条数据并支持事务回滚。经过努力,自行研究预处理方法,最终在ChatGPT的代码提示下,找到问题关键。
构建了一个使用async/await的MySQL连接池类,但预处理和事务方法无法正常使用。对照ChatGPT给出的代码,发现是连接池配置方式的问题。将mysql_pool替换为require('mysql2/promise'),并单独在每个需要连接的方法中获取连接。在query、execute和prepare方法中分别使用获取到的连接进行操作。使用prepare方法编译预处理SQL语句,通过for循环将数据分批处理并提交事务。在每个事务方法最后加入事务回滚和释放连接的代码。经过优化,处理1.5万条数据仅需1-2分钟,效率显著提升。
最后进行事务回滚测试,对数据进行限制,导致部分记录出错。结果显示所有记录均执行,但抛出错误,金额字段有问题。查询结果显示,1500条记录正确回滚。至此,数据迁移任务顺利完成,学习到新的MySQL预处理和事务知识,提升了效率。2024-08-24