Indici
Questa pagina è stata tradotta da PageTurner AI (beta). Non ufficialmente approvata dal progetto. Hai trovato un errore? Segnala problema →
Indici su colonna
Puoi creare un indice di database per una specifica colonna utilizzando @Index sulla colonna che desideri indicizzare.
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 (quando PostGIS è disponibile) supportano gli 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 (ad esempio lower, pg_trgm) a causa di molte differenze specifiche del database e di molteplici
problemi nel recuperare informazioni sugli indici esistenti e sincronizzarli automaticamente. In questi casi dovresti creare l'indice manualmente
(ad esempio, nelle migrazioni) con qualsiasi firma di indice desideri. Per fare in modo che TypeORM ignori questi indici durante la sincronizzazione, utilizza 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
}