Nodejs typeorm.js mysql 查询性能疑问

发布于 1周前 作者 zlyuanteng 来自 nodejs/Nestjs

Nodejs typeorm.js mysql 查询性能疑问

哪个性能好?

// 1. 多次查询
const users = await Promise.all(userIds.map(id => {
  return this.userRepository.findOne({
    where: {
      id
    }
  })
}))

// 2. 一次查询
const users = await this.userRepository.createQueryBuilder('user')
  .where('user.id IN (:...ids)', { ids: userIds })
  .getMany()



5 回复

一般情况肯定是 2 的性能比较好(只考虑数据库)。
但是如果放到实际项目中如果考虑缓存系统的话,1 的适应度反而会更高,缓存更友好更好控制。


必然是 2 性能好,缓存交给数据库自己去做就行,这种主键检索数据库自己的缓存比什么都快

适应度更高是因为都是 js, 缓存更友好没理解是啥意思,大佬解惑下

通过内部 api 获取对象的时候,因为都是通过主键操作增删改查,可以通过 id 去控制对象的缓存同步。

关于Node.js中使用TypeORM和MySQL的查询性能疑问,这里有一些关键的点和优化建议:

  1. 索引优化: 确保在MySQL数据库中对频繁查询的字段建立了索引。例如,如果你的查询经常根据某个字段过滤结果,应该为该字段建立索引。

    CREATE INDEX idx_fieldname ON tablename(fieldname);
    
  2. 查询优化: 使用TypeORM时,尽量使用构建器API(createQueryBuilder)来构建复杂的查询,这样可以更好地利用查询优化器。

    const users = await getRepository(User)
        .createQueryBuilder('user')
        .where('user.age > :age', { age: 25 })
        .getMany();
    
  3. 批量操作: 对于大量数据的插入、更新或删除操作,尽量使用批量操作来减少数据库的连接次数。

    const userRepository = getRepository(User);
    const usersToSave = [/* array of user entities */];
    await userRepository.save(usersToSave, { chunk: 100 }); // 分块保存
    
  4. 连接池配置: 合理配置MySQL连接池的大小,以避免连接过多导致的性能问题。

    TypeORM.createConnection({
        type: 'mysql',
        host: 'localhost',
        // 其他配置...
        pool: {
            max: 10, // 最大连接数
            min: 2,  // 最小连接数
            idleTimeoutMillis: 30000, // 连接空闲时间
        },
    });
    

通过上述方法,可以显著提升Node.js中使用TypeORM和MySQL的查询性能。如果问题依旧存在,建议进行具体的性能分析,如使用数据库的性能分析工具或Node.js的性能监控工具。

回到顶部