d本文主要记录一下批量插入数据的优化。
一、批量插入 【Node.js|typeorm 批量插入数据优化和插入冲突操作】首先能实现批量插入在typeorm中有save、insert和createQueryBuilder 这三种都可以。
根据官网上介绍的
You can create INSERT
queries using QueryBuilder
. Examples:
await dataSource
.createQueryBuilder()
.insert()
.into(User)
.values([
{ firstName: "Timber", lastName: "Saw" },
{ firstName: "Phantom", lastName: "Lancer" },
])
.execute()
This is the most efficient way in terms of performance to insert rows into your database. You can also perform bulk insertions this way.
这是一个非常搞笑的批量插入。但是我们发现如果我插入500条数据还会在操作日志中,还有跟着500条select 查询对应插入数据的id。加入我们不需要这个id的话 我们是可以关闭这个select的
entityManager
.createQueryBuilder()
.insert()
.into("user")
.values(users)
.updateEntity(false)
.execute();
或者save操作的时候增加参数{ reload: false }。
二、插入如果出现冲突的操作 有的时候在并发情况下插入数据会出现Duplicate entry '6' for key 'PRIMARY 主键冲突。
当然了 如果加分布式锁也会有一定影响。
- 加分布式锁也可能会影响消费者的消息处理速度。
- 消费者依赖于redis,如果redis出现网络超时,我们的服务就悲剧了。
await connection.createQueryBuilder()
.insert()
.into(Post)
.values(post2)
.onConflict(`("id") DO NOTHING`)
.execute();
await connection.createQueryBuilder()
.insert()
.into(Post)
.values(post2)
.onConflict(`("id") DO UPDATE SET "title" = :title`)
.setParameter("title", post2.title)
.execute();
对应的sql语句
INSERT INTO table (column_list)
VALUES (value_list)
ON DUPLICATE KEY UPDATE c1 = v1, c2 = v2,...;
推荐阅读
- mysql|mysql oder by 注入_orderby 注入
- Node.js|【Node.js】Express
- 笔记|MySql数据库修改密码【详细教程】
- Node.js工程师养成计划完整无密内置文档资料
- 2、mysql架构
- 故障分析 | MySQL Router(服务器后端那么闲,为什么不让访问())
- java开发工具|Java 程序员开发常用的工具推荐
- Java|JAVA+MYSQL 实现学生信息管理系统
- Java毕业设计项目实战篇|java mysql图书馆管理系统源码