d本文主要记录一下批量插入数据的优化。
首先能实现批量插入在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 主键冲突。
当然了 如果加分布式锁也会有一定影响。
如果对业务影响不是很大的话 可以考虑使用下面的语句。
- 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,...;