在 PostgreSQL 的 TypeORM 中,findOne(id) 比 findOne({ id }) 更快吗?

Mic*_*ler 3 postgresql repository-pattern typeorm nestjs

我正在使用带有 TypeORM 和 PostgreSQL 的 NestJS 框架。假设我有一个简单的User实体,它只有两个属性:id和name

@Entity()
class User {
  @PrimaryGeneratedColumn()
  id: string;

  @Column({
    type: 'varchar'
  })
  name: string;
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 比usersRepository.findOne(id)快吗usersRepository.findOne({ id })?

  2. 我认为这usersRepository.findOne(id)会比不在索引中更快usersRepository.findOne({ name }),name不是吗?

Mic*_*ler 8

我创建了一个包含 500 000 个项目的表,并对一些方法进行了基准测试(这些方法已被调用 100 000 次):

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n
方法平均时间 [\xc2\xb5s]
this.usersRepository.query(\'SELECT * FROM "users" WHERE id = 258\')163.98
this.usersRepository.query(\'SELECT * FROM "users" WHERE name = "John"\')143.77
this.usersRepository.findByIds([258])343.99
this.usersRepository.findOne(258)326.64
this.usersRepository.findOne({ id: 258 })338.89
this.usersRepository.findOne({ name: "John" })298.40
\n
\n

那么它看起来findOne(id)并不比 快(很多)findOne({ id })。而且,findOne({ name })也有类似的结果。然而,看起来使用自定义查询是最好的选择。

\n

  • 自定义查询始终是更快的选项,因为“find”可以做很多事情(将结果转换为类实例对象,调用侦听器等)。此外,由于 id 是主要的,因此按 id 进行原始查询应该更快,所以我想您需要做更好的基准测试(进行预热,进行多次尝试并获得平均结果)。 (3认同)