Nell'attuale panorama tecnologico in continua evoluzione, dove le prestazioni sono una priorità assoluta, i database svolgono un ruolo fondamentale nel garantire esperienze utente fluide e applicazioni affidabili.
In WeWard, dove ogni millisecondo conta per migliorare l'esperienza dell'utente, abbiamo intrapreso un viaggio ambizioso per trasformare PostgreSQL in un motore dalle prestazioni eccezionali. Questo articolo esplora le sfide affrontate, le soluzioni implementate e le best practice che ci hanno permesso di ottimizzare PostgreSQL in modo significativo.
In un mondo in cui gli utenti si aspettano tempi di risposta immediati, i database lenti possono causare frustrazione e opportunità perse. In WeWard, questa sfida si traduce in milioni di transazioni giornaliere e query complesse che richiedono prestazioni impeccabili. Le nostre sfide comprendevano query lente, carico eccessivo e un'architettura che richiedeva una maggiore scalabilità.
Ecco come abbiamo superato questi ostacoli.
La base di qualsiasi ottimizzazione di PostgreSQL inizia con l'analisi delle query. Abbiamo identificato le inefficienze studiando i piani di esecuzione delle query.
Utilizzo SPIEGARE
e ANALIZZARE
abbiamo ottenuto una visione a raggi X delle nostre richieste.
Esempio di query problematica:
SELECT level_customer.*
FROM level_customer
JOIN level ON level.id = level_customer.level_id
WHERE level_customer.customer_id = XXXXXXX
AND level_customer.start_date <= '2024-05-07'::date
AND level.version = 2
ORDER BY level_customer.start_date DESC, level.value DESC
LIMIT 1;
Problemi rilevati:
Soluzione: creazione di indici:
CREARE INDICE idx_level_customer_date_value
SU level_customer (customer_id, start_date DESC, level_id DESC);
Adeguamento del pianificatore:Abbiamo forzato PostgreSQL a usare Unioni ad anello annidate
invece di quello predefinito Unisci Hash
per questa specifica query.
Viste materializzate:per le query complesse, le viste materializzate riducono l'overhead di calcolo su ogni esecuzione, fornendo prestazioni notevolmente stabili.
Con milioni di interrogazioni giornaliere, abbiamo adottato un'architettura basata su repliche per distribuire il carico.
Vantaggi:
Considerazioni tecniche:
Le tabelle contenenti miliardi di righe possono rallentare notevolmente le operazioni di lettura e scrittura. Il partizionamento divide una tabella in sottoinsiemi più piccoli, migliorando l'efficienza delle query.
Strumento: pg_partman
Vantaggi:
Ogni connessione PostgreSQL consuma risorse di sistema. Per evitare il sovraccarico del server:
max_connessioni
è stato regolato in base all'hardware disponibile e alle esigenze dell'applicazione.Parametri chiave della memoria PostgreSQL:
buffer_condivisi
: Controlla l'allocazione della memoria per la memorizzazione nella cache dei dati a cui si accede di frequente.lavoro_mem
: Definisce la memoria per l'ordinamento e le tabelle hash durante l'esecuzione delle query.I dati critici ("caldi") rimangono in PostgreSQL, mentre i dati a cui si accede meno frequentemente ("freddi") vengono trasferiti su Amazon S3 o Google Cloud Storage. L'analisi dei dati freddi viene eseguita con Google BigQuery.
Vantaggi:
WeWard utilizza strumenti di monitoraggio avanzati come:
Vantaggi:
Combinando una rigorosa ottimizzazione delle query, una gestione intelligente delle risorse e architetture moderne, PostgreSQL è diventato un alleato fondamentale per WeWard. Queste soluzioni sono applicabili a qualsiasi organizzazione che voglia massimizzare il potenziale del database.
💬 Quali sono le vostre strategie per ottimizzare PostgreSQL? Condividete le vostre esperienze e partecipate alla conversazione!
👉 Esplora la nostra app mobile: WeWard.