Rendimiento y optimización en TypeORM
Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →
1. Introducción a la optimización de rendimiento
-
En aplicaciones que usan ORM como TypeORM, la optimización de rendimiento es crucial para garantizar que el sistema funcione sin problemas, minimice la latencia y utilice los recursos de manera eficiente.
-
Los desafíos comunes al usar ORM incluyen la recuperación innecesaria de datos, problemas de consultas N+1 y no aprovechar herramientas de optimización como indexación o caché.
-
Los principales objetivos de la optimización incluyen:
- Reducir el número de consultas SQL enviadas a la base de datos.
- Optimizar consultas complejas para que se ejecuten más rápido.
- Usar caché e indexación para acelerar la recuperación de datos.
- Garantizar una recuperación eficiente de datos usando métodos de carga apropiados (Carga diferida vs. Carga ansiosa).
2. Uso eficiente del Query Builder
2.1. Evitar el problema de consultas N+1
-
El Problema de Consultas N+1 ocurre cuando el sistema ejecuta demasiadas subconsultas por cada fila de datos recuperada.
-
Para evitarlo, puedes usar
leftJoinAndSelectoinnerJoinAndSelectpara combinar tablas en una sola consulta en lugar de ejecutar múltiples consultas.
const users = await dataSource
.getRepository(User)
.createQueryBuilder("user")
.leftJoinAndSelect("user.posts", "post")
.getMany()
- Aquí,
leftJoinAndSelectayuda a recuperar todas las publicaciones del usuario en una sola consulta en lugar de muchas consultas pequeñas.
2.2. Usar getRawMany() cuando solo se necesitan datos sin procesar
- En casos donde no se requieren objetos completos, puedes usar
getRawMany()para obtener datos sin procesar y evitar que TypeORM procese demasiada información.
const rawPosts = await dataSource
.getRepository(Post)
.createQueryBuilder("post")
.select("post.title, post.createdAt")
.getRawMany()
2.3. Limitar campos usando select
- Para optimizar el uso de memoria y reducir datos innecesarios, selecciona solo los campos requeridos usando
select.
const users = await dataSource
.getRepository(User)
.createQueryBuilder("user")
.select(["user.name", "user.email"])
.getMany()
3. Uso de índices
- Los índices aceleran el rendimiento de las consultas en la base de datos al reducir la cantidad de datos escaneados. TypeORM admite crear índices en columnas de tablas usando el decorador
@Index.
3.1. Creación de un índice
- Los índices pueden crearse directamente en las entidades usando el decorador
@Index.
import { Entity, Column, Index } from "typeorm"
@Entity()
@Index(["firstName", "lastName"]) // Composite index
export class User {
@Column()
firstName: string
@Column()
lastName: string
}