optimiser les performances d’une api node.js avec postgresql : pool, index et partitionnement
08/10/2025
optimiser les performances d’une api node.js avec postgresql : pool, index et partitionnement
Lorsque votre API Node.js rencontre un volume important de requêtes, la base de données PostgreSQL peut devenir un goulot d’étranglement. Cet article détaille trois leviers techniques pour gagner en rapidité : la gestion du pool de connexions, l’indexation des colonnes stratégiques et le partitionnement des tables volumineuses. Vous trouverez des exemples concrets de code, des commandes CLI et des métriques de performance.
1. Mettre en place un pool de connexions efficace
Sans pool, chaque requête ouvrirait une connexion séparée à PostgreSQL, générant une surcharge CPU et mémoire. Avec pg (le client officiel PostgreSQL pour Node.js), vous pouvez gérer un pool :
const { Pool } = require('pg');
const pool = new Pool({
user: 'dbuser',
host: 'localhost',
database: 'mydb',
password: 'secret',
port: 5432,
max: 20, // nombre max de connexions
idleTimeoutMillis: 30000,
connectionTimeoutMillis: 2000,
});
module.exports = pool;
Ensuite, dans vos routes Express (Node.js), récupérez une connexion :
app.get('/items', async (req, res) => {
try {
const client = await pool.connect();
const result = await client.query('SELECT * FROM items');
client.release();
res.json(result.rows);
} catch (err) {
console.error('DB Error', err);
res.status(500).send('Erreur serveur');
}
});
Tip perf : surveillez totalCount
de connexions avec SELECT * FROM pg_stat_activity;
.
2. Créer des index adaptés
Une bonne indexation peut réduire un scan complet de table de plusieurs secondes à quelques millisecondes. Analysez d’abord vos requêtes lentes :
EXPLAIN ANALYZE SELECT * FROM orders WHERE customer_id = 123;
Si le plan affiche un Seq Scan
, créez un index :
CREATE INDEX idx_orders_customer ON orders(customer_id);
Re-testez avec EXPLAIN ANALYZE pour mesurer le gain. Vous pouvez également combiner plusieurs colonnes si vous filtrez sur plusieurs champs.
3. Partitionner les tables volumineuses
Pour des tables à plusieurs millions de lignes (logs, transactions, etc.), le partitionnement permet de diviser physiquement les données par plage de dates, par exemple :
CREATE TABLE events (
id SERIAL PRIMARY KEY,
occurred_at TIMESTAMP NOT NULL,
data JSONB
) PARTITION BY RANGE (occurred_at);
CREATE TABLE events_2023 PARTITION OF events
FOR VALUES FROM ('2023-01-01') TO ('2024-01-01');
CREATE TABLE events_2024 PARTITION OF events
FOR VALUES FROM ('2024-01-01') TO ('2025-01-01');
Les requêtes sur occurred_at
ciblent automatiquement le bon « chunk », réduisant le temps de recherche. Pensez à rechecker régulièrement les statistiques via ANALYZE
et PostgreSQL.
Bonnes pratiques et conseils
- Activez la compression des logs et utilisez
pg_stat_statements
pour repérer les requêtes les plus lourdes. - Cachez en mémoire (Redis) les réponses peu volatiles pour réduire la charge SQL.
- Surveillez les métriques CPU, I/O et mémoire avec des outils comme Prometheus/Grafana.
- Intégrez ces optimisations dès la phase de conception pour éviter la dette technique.
Conclusion
En combinant un pool de connexions bien configuré, des index adaptés et un partitionnement réfléchi, vous pouvez réduire significativement les temps de réponse de votre API Node.js sous PostgreSQL. Ces optimisations se traduisent directement en meilleure expérience utilisateur et en réduction des coûts infrastructure.
Envie d’un audit performance sur-mesure ? Contactez nos experts pour une séance de consulting offerte.