Indizes
Diese Seite wurde von PageTurner AI übersetzt (Beta). Nicht offiziell vom Projekt unterstützt. Fehler gefunden? Problem melden →
Spaltenindizes
Du kannst einen Datenbankindex für eine bestimmte Spalte erstellen, indem du @Index auf die Spalte anwendest, die du indizieren möchtest.
Du kannst Indizes für beliebige Spalten deiner Entität erstellen.
Beispiel:
import { Entity, PrimaryGeneratedColumn, Column, Index } from "typeorm"
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number
@Index()
@Column()
firstName: string
@Column()
@Index()
lastName: string
}
Du kannst auch einen Indexnamen angeben:
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
}
Eindeutige Indizes
Um einen eindeutigen Index zu erstellen, musst du { unique: true } in den Indexoptionen angeben:
Hinweis: CockroachDB speichert eindeutige Indizes als
UNIQUE-Constraints
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
}
Indizes mit mehreren Spalten
Um einen Index mit mehreren Spalten zu erstellen, musst du @Index auf der Entität selbst platzieren
und alle Spalteneigenschaftsnamen angeben, die im Index enthalten sein sollen.
Beispiel:
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
}
Räumliche Indizes
MySQL, CockroachDB und PostgreSQL (sofern PostGIS verfügbar ist) unterstützen räumliche Indizes.
Um einen räumlichen Index für eine Spalte in MySQL zu erstellen, füge einen Index mit spatial: true zu einer Spalte hinzu, die einen räumlichen Typ verwendet (geometry, point, linestring,
polygon, multipoint, multilinestring, multipolygon,
geometrycollection):
@Entity()
export class Thing {
@Column("point")
@Index({ spatial: true })
point: string
}
Um einen räumlichen Index für eine Spalte zu erstellen, füge einen Index mit spatial: true zu einer Spalte hinzu, die einen räumlichen Typ (geometry, geography) verwendet:
export interface Geometry {
type: "Point"
coordinates: [Number, Number]
}
@Entity()
export class Thing {
@Column("geometry", {
spatialFeatureType: "Point",
srid: 4326,
})
@Index({ spatial: true })
point: Geometry
}
Nebenläufige Erstellung
Um zu vermeiden, dass du beim Erstellen und Löschen von Indizes in PostgreSQL einen ACCESS EXCLUSIVE-Lock erhalten musst, kannst du sie mit dem CONCURRENTLY-Modifier erstellen.
Wenn du die nebenläufige Option verwenden möchtest, musst du migrationsTransactionMode: none in deinen Data-Source-Optionen setzen.
TypeORM unterstützt die Generierung von SQL mit dieser Option, wenn die nebenläufige Option für den Index angegeben wird.
@Index(["firstName", "middleName", "lastName"], { concurrent: true })
Weitere Informationen findest du in der PostgreSQL-Dokumentation.
Indextyp
Wenn du einen benutzerdefinierten Typ für den Index festlegen musst, kannst du die type-Eigenschaft verwenden. Wenn die spatial-Eigenschaft gesetzt ist, wird dieses Feld ignoriert.
@Index({ type: 'hash' })
Diese Funktion wird derzeit nur von PostgreSQL unterstützt.
Deaktivierung der Synchronisierung
TypeORM unterstützt einige Indexoptionen und -definitionen (z. B. lower, pg_trgm) aufgrund zahlreicher datenbankspezifischer Unterschiede und mehrerer
Probleme beim Abrufen von Informationen über vorhandene Datenbankindizes und deren automatischer Synchronisierung nicht. In solchen Fällen solltest du den Index manuell erstellen
(zum Beispiel in den Migrationen) mit der gewünschten Indexsignatur. Damit TypeORM diese Indizes während der Synchronisierung ignoriert, verwende die Option
synchronize: false im @Index-Dekorator.
Beispiel: Du erstellst einen Index mit fallunabhängigem Vergleich:
CREATE INDEX "POST_NAME_INDEX" ON "post" (lower("name"))
Anschließend solltest du die Synchronisierung für diesen Index deaktivieren, um ein Löschen bei der nächsten Schema-Synchronisierung zu verhindern:
@Entity()
@Index("POST_NAME_INDEX", { synchronize: false })
export class Post {
@PrimaryGeneratedColumn()
id: number
@Column()
name: string
}