typeorm 批量插入数据优化和插入冲突操作

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 主键冲突。

当然了 如果加分布式锁也会有一定影响。

  1. 加分布式锁也可能会影响消费者的消息处理速度。
  2. 消费者依赖于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,...;

你可能感兴趣的:(Node.js,数据库,mysql)