Articles
Aug 28, 2024

Optimisation des Performances avec Prisma et NestJS

Bien que Prisma soit rapide et efficace par défaut, il existe plusieurs façons d'améliorer encore les performances de vos applications utilisant Prisma avec NestJS

Optimisation des Performances avec Prisma et NestJS

Dans cet article, nous examinerons les meilleures pratiques et les fonctionnalités avancées pour optimiser les performances de Prisma.

Introduction

Lorsque vous développez des applications à grande échelle, les performances deviennent cruciales. Des temps de réponse lents peuvent nuire à l'expérience utilisateur et la rentabilité de l'application. Prisma, avec ses nombreuses fonctionnalités, offre plusieurs solutions pour optimiser les performances des requêtes et des transactions de base de données.

Plan

  1. Utilisation des Indexes
  2. Parallélisation des Requêtes
  3. Pagination Efficace
  4. Chargement des Données (Lazy Loading)
  5. Optimisation des Transactions
  6. Utilisation de Prisma Accelerate

---

Utilisation des Indexes

Les indexes permettent d'accélérer les recherches dans la base de données. Dans Prisma, vous pouvez définir des indexes directement dans le schéma. Voici un exemple :

model User {
  id        Int       @id @default(autoincrement())
  name      String
  email     String    @unique
  createdAt DateTime  @default(now())
  posts     Post[]
  comments  Comment[]
  @@index([email])
}

L'utilisation d'indexes sur des colonnes fréquemment recherchées peut considérablement accélérer les opérations de lecture.

---

Parallélisation des Requêtes

Au lieu d'exécuter des requêtes séquentiellement, vous pouvez les exécuter en parallèle pour améliorer les performances. NestJS et Prisma permettent d'utiliser Promise.all pour cet effet.

const [users, posts] = await Promise.all([
  this.prisma.user.findMany(), 
  this.prisma.post.findMany()
]);

Cette technique permet de réduire le temps total d'exécution des requêtes en les exécutant simultanément.

---

Pagination Efficace

Pour les ensembles de données volumineux, il est essentiel d'implémenter une pagination efficace pour éviter le chargement de toutes les données en mémoire.

   const pageSize = 10;
    const page = 1;
    const users = await this.prisma.user.findMany({
      skip: (page - 1) * pageSize,
      take: pageSize,
    });

En utilisant les options skip et take, vous pouvez récupérer des données par morceaux.

---

Chargement des Données (Lazy Loading)

Prisma permet de charger uniquement les champs nécessaires pour une opération donnée, réduisant ainsi la quantité de données transférées et le temps de traitement.

const user = await this.prisma.user.findUnique({
  where: { id: 1 },
  select: { id: true, email: true, profile: false },// Exclure le chargement du profil
});

En utilisant select et include, vous pouvez contrôler exactement quelles données sont chargées.

---

Optimisation des Transactions

Les transactions peuvent être coûteuses en termes de performance, surtout si elles impliquent plusieurs requêtes complexes. Utilisez les transactions Prisma pour regrouper les opérations atomiques et réduire les allers-retours entre l'application et la base de données.

  await this.prisma.$transaction(async (prisma) => {
      await prisma.user.update({
        /* ... */
      });
      await prisma.post.update({
        /* ... */
      });

En regroupant les opérations connexes dans une transaction unique, vous pouvez réduire le temps total de traitement.

---

Utilisation de Prisma Accelerate

Prisma Accelerate est une fonctionnalité avancée pour optimiser les performances des requêtes Prisma.

Elle peut être configurée via Prisma Data Platform

https://console.prisma.io/

Une fois configuré de ce côté, il ne vous reste plus qu'à rajouter la nouvelle url fournie par Prisma Data Platform

.env

DATABASE_URL="prisma://accelerate.prisma-data.net/?api_key=__API_KEY__"
DIRECT_DATABASE_URL="postgresql://user:password@host:port/db_name?schema=public"

schema.prisma

datasource db {
  provider  = "postgresql"
  url       = env("DATABASE_URL")
  directUrl = env("DIRECT_DATABASE_URL")
}

---

Conclusion

L'optimisation des performances avec Prisma dans une application NestJS nécessite une approche multifacette : de l'utilisation d'indexes à la parallélisation des requêtes, en passant par une pagination efficace et l'utilisation des transactions. En intégrant ces meilleures pratiques, vous pouvez garantir que votre application reste rapide et réactive, même sous des charges importantes.

Surveillez régulièrement les performances de vos requêtes et ajustez vos configurations en conséquence pour maintenir une application optimale.