索引
列索引
您可以通过在要创建索引的列上使用 @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
)的列上添加 Index
,并设置 spatial: true
:
@Entity()
export class Thing {
@Column("point")
@Index({ spatial: true })
point: string
}
要在列上创建空间索引,请在使用空间类型(geometry
、geography
)的列上添加 Index
,并设置 spatial: true
:
export interface Geometry {
type: "Point"
coordinates: [Number, Number]
}
@Entity()
export class Thing {
@Column("geometry", {
spatialFeatureType: "Point",
srid: 4326,
})
@Index({ spatial: true })
point: Geometry
}
Disabling synchronization
由于不同的数据库特性和关于现有数据库索引信息获取和自动同步的多个问题,TypeORM 不支持某些索引选项和定义(例如 lower
、pg_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
}