Saltar al contenido principal

Índices

Traducción Beta No Oficial

Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →

Índices de columna

Puedes crear un índice de base de datos para una columna específica usando @Index en la columna que deseas indexar. Puedes crear índices para cualquier columna de tu entidad. Ejemplo:

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

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

@Index()
@Column()
firstName: string

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

También puedes especificar un nombre para el índice:

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
}

Índices únicos

Para crear un índice único necesitas especificar { unique: true } en las opciones del índice:

Nota: CockroachDB almacena índices únicos como restricciones 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
}

Índices con múltiples columnas

Para crear un índice con múltiples columnas, coloca @Index en la entidad misma y especifica todos los nombres de propiedades de columna que deben incluirse en el índice. Ejemplo:

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
}

Índices espaciales

MySQL, CockroachDB y PostgreSQL (cuando PostGIS está disponible) admiten índices espaciales.

Para crear un índice espacial en una columna en MySQL, agrega Index con spatial: true en una columna que use tipos espaciales (geometry, point, linestring, polygon, multipoint, multilinestring, multipolygon, geometrycollection):

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

Para crear un índice espacial en una columna, agrega Index con spatial: true en una columna que use tipos espaciales (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
}

Creación concurrente

Para evitar tener que obtener un bloqueo ACCESS EXCLUSIVE al crear y eliminar índices en Postgres, puedes crearlos usando el modificador CONCURRENTLY. Si deseas usar la opción concurrente, necesitas establecer migrationsTransactionMode: none en las opciones de tu fuente de datos.

TypeORM admite generar SQL con esta opción cuando se especifica la opción concurrente en el índice.

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

Para más información, consulta la documentación de PostgreSQL.

Tipo de índice

Si necesitas especificar un tipo personalizado para el índice, puedes usar la propiedad type. Si la propiedad spatial está establecida, este campo será ignorado.

@Index({ type: 'hash' })

Esta característica actualmente solo es compatible con PostgreSQL.

Deshabilitar sincronización

TypeORM no admite algunas opciones y definiciones de índices (por ejemplo, lower, pg_trgm) debido a las múltiples diferencias específicas de cada base de datos y problemas recurrentes para obtener información sobre índices existentes y sincronizarlos automáticamente. En estos casos, debes crear el índice manualmente (por ejemplo, en las migraciones) con cualquier firma de índice que necesites. Para que TypeORM ignore estos índices durante la sincronización, usa la opción synchronize: false en el decorador @Index.

Por ejemplo, creas un índice con comparación insensible a mayúsculas:

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

después de esto, debes deshabilitar la sincronización para este índice y evitar su eliminación en la próxima sincronización de esquema:

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

@Column()
name: string
}