Indici
Questa pagina è stata tradotta da PageTurner AI (beta). Non ufficialmente approvata dal progetto. Hai trovato un errore? Segnala problema →
Indici su singola colonna
Puoi creare un indice del database per una colonna specifica usando @Index sulla colonna desiderata.
Puoi creare indici per qualsiasi colonna della tua entità.
Esempio:
import { Entity, PrimaryGeneratedColumn, Column, Index } from "typeorm"
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number
@Index()
@Column()
firstName: string
@Column()
@Index()
lastName: string
}
Puoi anche specificare un nome per l'indice:
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
}
Indici univoci
Per creare un indice univoco, specifica { unique: true } nelle opzioni dell'indice:
Nota: CockroachDB memorizza gli indici univoci come vincoli
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
}
Indici su più colonne
Per creare un indice su più colonne, posiziona @Index sull'entità stessa
e specifica tutti i nomi delle proprietà delle colonne da includere nell'indice.
Esempio:
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
}
Indici spaziali
MySQL, CockroachDB e PostgreSQL (con PostGIS installato) supportano indici spaziali.
Per creare un indice spaziale su una colonna in MySQL, aggiungi Index con spatial: true a una colonna che utilizza un tipo spaziale (geometry, point, linestring,
polygon, multipoint, multilinestring, multipolygon,
geometrycollection):
@Entity()
export class Thing {
@Column("point")
@Index({ spatial: true })
point: string
}
Per creare un indice spaziale su una colonna, aggiungi Index con spatial: true a una colonna che utilizza un tipo spaziale (geometry, geography):
export interface Geometry {
type: "Point"
coordinates: [Number, Number]
}
@Entity()
export class Thing {
@Column("geometry", {
spatialFeatureType: "Point",
srid: 4326,
})
@Index({ spatial: true })
point: Geometry
}
Creazione concorrente
Per evitare di acquisire un lock ACCESS EXCLUSIVE durante la creazione/rimozione di indici in Postgres, puoi utilizzare il modificatore CONCURRENTLY.
Per usare l'opzione concorrente, imposta migrationsTransactionMode: none nelle opzioni della tua data source.
TypeORM supporta la generazione di SQL con questa opzione quando l'opzione concurrent è specificata sull'indice.
@Index(["firstName", "middleName", "lastName"], { concurrent: true })
Per maggiori informazioni consulta la documentazione di Postgres.
Tipo di indice
Se devi specificare un tipo personalizzato per l'indice, puoi utilizzare la proprietà type. Se la proprietà spatial è impostata, questo campo verrà ignorato.
@Index({ type: 'hash' })
Questa funzionalità è attualmente supportata solo per PostgreSQL.
Disabilitazione della sincronizzazione
TypeORM non supporta alcune opzioni e definizioni di indici (es. lower, pg_trgm) a causa delle differenze specifiche dei database e di problemi
nella raccolta automatica delle informazioni sugli indici esistenti. In questi casi dovresti creare l'indice manualmente
(ad esempio nelle migrazioni) con qualsiasi firma desiderata. Per far ignorare a TypeORM questi indici durante la sincronizzazione, usa l'opzione
synchronize: false nel decoratore @Index.
Ad esempio, crei un indice con confronto case-insensitive:
CREATE INDEX "POST_NAME_INDEX" ON "post" (lower("name"))
successivamente, dovresti disabilitare la sincronizzazione per questo indice per evitare l'eliminazione nella prossima sincronizzazione dello schema:
@Entity()
@Index("POST_NAME_INDEX", { synchronize: false })
export class Post {
@PrimaryGeneratedColumn()
id: number
@Column()
name: string
}