跳至主内容区

索引

非官方测试版翻译

本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →

列索引

通过在目标列上使用 @Index 装饰器,可以为特定列创建数据库索引。 您可以为实体的任意列创建索引。 示例:

import { Entity, PrimaryGeneratedColumn, Column, Index } from "typeorm"

@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number

@Index()
@Column()
firstName: string

@Column()
@Index()
lastName: string
}

您还可以指定索引名称:

import { Entity, PrimaryGeneratedColumn, Column, Index } from "typeorm"

@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number

@Index("name1-idx")
@Column()
firstName: string

@Column()
@Index("name2-idx")
lastName: string
}

唯一索引

要创建唯一索引,需要在索引选项中指定 { unique: true }

注意:CockroachDB 将唯一索引存储为 UNIQUE 约束

import { Entity, PrimaryGeneratedColumn, Column, Index } from "typeorm"

@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number

@Index({ unique: true })
@Column()
firstName: string

@Column()
@Index({ unique: true })
lastName: string
}

多列索引

创建多列索引时,需将 @Index 装饰器置于实体类上, 并指定需要包含在索引中的所有列属性名称。 示例:

import { Entity, PrimaryGeneratedColumn, Column, Index } from "typeorm"

@Entity()
@Index(["firstName", "lastName"])
@Index(["firstName", "middleName", "lastName"], { unique: true })
export class User {
@PrimaryGeneratedColumn()
id: number

@Column()
firstName: string

@Column()
middleName: string

@Column()
lastName: string
}

空间索引

MySQL、CockroachDB 和 PostgreSQL(安装 PostGIS 后)支持空间索引。

在 MySQL 中为使用空间类型(geometry, point, linestring, polygon, multipoint, multilinestring, multipolygon, geometrycollection)的列创建空间索引时,需添加带有 spatial: trueIndex

@Entity()
export class Thing {
@Column("point")
@Index({ spatial: true })
point: string
}

要为使用空间类型(geometry, geography)的列创建空间索引, 需在该列上添加带有 spatial: true 选项的 Index

export interface Geometry {
type: "Point"
coordinates: [Number, Number]
}

@Entity()
export class Thing {
@Column("geometry", {
spatialFeatureType: "Point",
srid: 4326,
})
@Index({ spatial: true })
point: Geometry
}

并发创建

为避免在 PostgreSQL 中创建和删除索引时获取 ACCESS EXCLUSIVE 锁,可使用 CONCURRENTLY 修饰符创建索引。 若要使用并发选项,需在数据源选项中设置 migrationsTransactionMode: none

当在索引上指定并发选项时,TypeORM 支持生成带有此选项的 SQL 语句。

@Index(["firstName", "middleName", "lastName"], { concurrent: true })

更多信息请参阅 PostgreSQL 文档

索引类型

若需为索引指定自定义类型,可使用 type 属性。若已设置 spatial 属性,则该字段将被忽略。

@Index({ type: 'hash' })

此功能目前仅支持 PostgreSQL。

禁用同步

由于存在大量数据库特定的差异,以及在获取现有数据库索引信息和自动同步索引时存在诸多问题,TypeORM 不支持某些索引选项和定义(例如 lowerpg_trgm)。在这种情况下,您应该手动创建索引(例如在迁移中),并可以使用任意索引签名。为了让 TypeORM 在同步时忽略这些索引,请在 @Index 装饰器中使用 synchronize: false 选项。

例如创建不区分大小写的索引:

CREATE INDEX "POST_NAME_INDEX" ON "post" (lower("name"))

随后应禁用此索引的同步,避免下次模式同步时被删除:

@Entity()
@Index("POST_NAME_INDEX", { synchronize: false })
export class Post {
@PrimaryGeneratedColumn()
id: number

@Column()
name: string
}