TypeORM配合PostgreSQL使用时findOne(id)是否比findOne({id})更快?
TypeORM 查询性能相关问题解答
给出的User实体定义如下:
@Entity() class User { @PrimaryGeneratedColumn() id: string; @Column({ type: 'varchar' }) name: string; }
问题1:调用usersRepository.findOne(id)的执行速度是否比usersRepository.findOne({ id })更快?
两者执行速度完全一致,没有性能差异。
直接传入id作为参数的写法是TypeORM提供的语法糖,底层会自动将入参转换为主键查询条件,最终生成的SQL语句和findOne({ id })完全相同,都是基于主键索引做查询,PostgreSQL的执行计划没有任何区别,因此执行速度一致。
问题2:由于name字段未建立索引,因此usersRepository.findOne(id)的执行速度会快于usersRepository.findOne({ name }),该推测是否正确?
该推测完全正确。
- PostgreSQL会自动为实体的主键字段创建唯一B树索引,
findOne(id)本质是走主键索引查询,时间复杂度为O(log n),查询效率极高。 - 未给name字段建立索引的情况下,
findOne({ name })会触发全表扫描,需要逐行匹配name字段的值,时间复杂度为O(n),表内数据量越大,查询速度比主键查询慢得越明显。
内容的提问来源于stack exchange,提问作者Michał Miler
相关产品推荐
相关产品推荐

