13 Ottobre 2026

La web Cache non risolve i problemi, ma nasconde la polvere sotto al tappeto

Un TTFB di 4 secondi non si cura con la cache: si cura trovando dove finisce il tempo. Profilazione con APM, slow log, EXPLAIN e ottimizzazione applicativa.

La web cache nasconde la polvere sotto al tappeto: query lente, TTFB di 4 secondi e plugin

C’è una richiesta che riceviamo quasi ogni settimana, con parole sempre diverse e sempre la stessa sostanza: “il sito è lento, ci serve un hosting più veloce” oppure “attivateci la cache, così si risolve”. Dietro, quasi sempre, c’è un sito bellissimo da vedere, curato nella grafica, con un tempo di risposta del server che supera i tre o quattro secondi prima ancora che il browser inizi a disegnare la pagina.

Il cliente ha ragione a chiedere un sito veloce. Ha torto, o meglio è stato portato a credere una cosa sbagliata, quando pensa che la velocità si compri cambiando hosting o accendendo una cache. La web cache non risolve i problemi: li nasconde, come la polvere sotto al tappeto. Funziona finché nessuno solleva il tappeto. Poi qualcuno lo solleva: un cliente che mette un prodotto nel carrello, un utente che fa login, un bot che chiede una pagina mai vista, una campagna pubblicitaria che porta traffico su pagine non in cache. E la polvere è ancora tutta lì.

In questo articolo voglio spiegare perché succede, perché la responsabilità viene scaricata così spesso sull’hosting e cosa significa davvero ottimizzare un’applicazione, dal database a PHP, passando per la profilazione e la ricerca dei colli di bottiglia.

Siti belli, performance vergognose

Negli ultimi anni costruire un sito è diventato facilissimo. Un tema acquistato, un page builder, una ventina di plugin per aggiungere funzioni, e in pochi giorni il sito è online. È un progresso enorme, e non lo dico con nostalgia. Ma questa facilità ha un prezzo che raramente viene spiegato: ogni plugin, ogni modulo, ogni funzione aggiunta con un clic esegue codice e interroga il database a ogni pagina, e quasi nessuno sa quanto costi.

Il risultato lo vediamo tutti i giorni. Pagine che eseguono centinaia di query al database per mostrare un elenco di prodotti. Plugin che caricano a ogni richiesta opzioni che non servono. Ricerche che scorrono tabelle intere da milioni di righe perché manca un indice. Chiamate a servizi esterni fatte durante la generazione della pagina, che aspettano risposte da server lontani. Ogni singola scelta sembra innocua; sommate, portano a TTFB di quattro secondi e oltre.

Profilazione di un TTFB di 4 secondi: database, plugin, chiamate esterne e PHP
Dove finiscono 4 secondi di TTFB: la profilazione mostra che la maggior parte del tempo è spesa nel database.

Il problema delle basi

Lo dico con franchezza, perché lavoro in questo settore da molti anni e credo che sia necessario dirlo: troppo spesso chi si presenta come sviluppatore non lo è. È qualcuno che sa installare e configurare plugin, che conosce bene un page builder, che sa rendere un sito gradevole. Sono competenze utili, ma non sono sviluppo software.

Molte di queste figure non hanno alle spalle un percorso accademico in informatica, e spesso nemmeno una formazione tecnica come quella del vecchio ITIS a indirizzo informatico, dove si studiavano algoritmi, strutture dati, basi di dati e sistemi. Non è una questione di titoli da appendere al muro: conosco ottimi professionisti autodidatti, che hanno studiato da soli e sul serio. È una questione di basi teoriche. E quando le basi mancano, si vede nel momento esatto in cui qualcosa va storto.

Mancano concetti che dovrebbero essere il pane quotidiano di chi scrive o assembla software:

  • il costo di ogni operazione: leggere una riga tramite un indice è diverso dallo scorrere una tabella intera, e la differenza cresce con i dati. Una funzione che va bene con cento prodotti diventa un disastro con centomila;
  • le buone pratiche di una base di dati: normalizzazione dove serve, tipi di dato corretti, chiavi e vincoli, tabelle che non crescono senza controllo;
  • il concetto di query lenta: sapere che esiste, come si individua, perché una query che impiega due secondi eseguita a ogni pagina mette in ginocchio qualsiasi server;
  • l’utilità degli indici: cosa sono, quando servono, quando fanno danno, come il database decide se usarli;
  • la differenza tra lavoro fatto una volta e lavoro fatto a ogni richiesta: calcoli che potrebbero essere salvati e invece vengono ripetuti migliaia di volte al giorno.

Senza queste basi, quando il sito rallenta non si sa da dove cominciare. Si prova un plugin di ottimizzazione, poi un altro, poi si comprimono le immagini, poi si minifica il CSS. Tutte cose che migliorano il caricamento lato browser, ma che non toccano il problema vero: il server che impiega quattro secondi a generare la pagina.

La scorciatoia: “cambiamo hosting e attiviamo la cache”

A questo punto il cliente, comprensibilmente stanco, cerca la soluzione più semplice. Se il sito è lento, sarà colpa del server. Si cambia hosting, si sceglie un piano più costoso, si chiede di attivare la cache. Ed effettivamente, per un po’, qualcosa migliora: le pagine visitate più spesso dai visitatori anonimi vengono servite dalla cache in pochi millisecondi.

Ma una web cache conserva copie di pagine già generate. Non rende più veloce la generazione delle pagine; evita solo di ripeterla, quando può. E ci sono tante situazioni in cui non può:

  • gli utenti autenticati, che vedono pagine personali e non possono ricevere la copia di qualcun altro;
  • il carrello e il checkout di un e-commerce, cioè proprio le pagine in cui si guadagna;
  • l’area amministrativa, dove chi gestisce il sito lavora ogni giorno e aspetta secondi per ogni salvataggio;
  • le ricerche e i filtri, che generano combinazioni quasi infinite e raramente si ripetono;
  • la prima visita di ogni pagina dopo una scadenza o un aggiornamento, che deve comunque essere generata;
  • i bot e i crawler, che chiedono sistematicamente pagine che nessun altro chiede.

In tutti questi casi la richiesta arriva all’applicazione e paga per intero i suoi quattro secondi. Il sito sembra veloce quando lo si prova dalla home da anonimi; è lento esattamente dove conta.

Cosa copre la web cache e cosa resta generato a ogni richiesta
La cache serve in pochi millisecondi le pagine uguali per tutti: carrello, login, ricerche e area amministrativa pagano il tempo pieno.

Ne abbiamo già parlato a proposito dei cataloghi e della navigazione faccettata e della favola della cache che risolve tutto: la cache è uno strumento eccellente, che usiamo ovunque, ma è uno strato che si appoggia sopra un’applicazione sana. Non sostituisce un’applicazione sana.

Anche dall’altra parte della barricata mancano le competenze

Il cliente, a quel punto, si rivolge all’hosting sperando di trovare chi risolva. E qui spesso trova un’altra delusione. Molti fornitori di hosting hanno un supporto tecnico preparato sulla propria infrastruttura, ma le figure che rispondono, per formazione e per ruolo, non sono sviluppatori e tanto meno DBA. Sanno riavviare un servizio, aumentare la memoria, attivare un modulo di cache. Non si addentrano nell’applicazione, perché non è il loro mestiere e spesso non è previsto dal servizio.

Così la risposta tipica diventa una delle tre classiche: “il problema è applicativo, si rivolga al suo sviluppatore”, oppure “passi al piano superiore”, oppure “attivi il nostro sistema di cache”. Nessuna delle tre è sbagliata in senso stretto, ma nessuna risolve. Il cliente torna dallo sviluppatore, che non sa da dove partire, e il cerchio si chiude.

Per uscire da questo cerchio servono competenze che stanno a metà strada tra sistemi e sviluppo, e che pochi hanno insieme:

  • la profilazione dell’applicazione con strumenti APM come Datadog o New Relic, che mostrano dove va il tempo di ogni richiesta: quale funzione, quale plugin, quale query, quale chiamata esterna;
  • più semplicemente, la profilazione con gli strumenti già presenti sul server: il log delle richieste PHP lente, che indica in quale punto del codice un processo è rimasto bloccato, e il log delle query lente del database, che raccoglie le interrogazioni che superano una soglia di tempo;
  • la lettura del piano di esecuzione di una query, cioè il risultato del comando EXPLAIN, che dice come il database intende recuperare i dati: se usa un indice, quante righe pensa di leggere, se deve creare tabelle temporanee o ordinare su disco;
  • la capacità di intervenire: creare l’indice giusto, riscrivere una query, spostare un calcolo fuori dal percorso critico, sostituire un plugin che fa cento query con una soluzione che ne fa una.

Leggere un EXPLAIN e riscrivere una query non è magia, ma richiede proprio quelle basi di cui parlavo prima. E richiede di accettare che il problema stia nell’applicazione, non nell’hardware.

Un esempio: quando manca un indice

Per capire di cosa stiamo parlando basta un caso molto comune. Un e-commerce con due milioni di ordini storici mostra, in una pagina dell’area clienti, gli ultimi ordini dell’utente. La query cerca gli ordini per cliente e li ordina per data. Senza un indice adatto, il database non ha alternative: scorre tutta la tabella, due milioni di righe, poi ordina il risultato. Su un server moderno ci vuole qualche secondo; con dieci utenti contemporanei il database è saturo.

Con un indice composto su cliente e data, la stessa query legge solo le poche righe di quel cliente, già nell’ordine giusto. Il tempo scende a pochi millisecondi. Nessun cambio di hosting, nessuna cache: un’operazione di pochi secondi da parte di chi sa cosa sta facendo. Questo è l’esempio più semplice, quello da manuale; nella realtà i casi sono spesso più intricati, con query generate da plugin, join su tabelle di metadati enormi, opzioni caricate a ogni richiesta, ma il principio non cambia.

Confronto tra la stessa query con e senza indice sul database
Lo stesso database con un indice in più: da secondi a pochi millisecondi, senza cambiare hosting.

Perché il problema peggiora con il tempo

C’è un aspetto che rende la polvere sotto al tappeto ancora più insidiosa: cresce da sola. Un sito appena pubblicato ha poche pagine, pochi prodotti, pochi ordini, tabelle piccole. Anche una query scritta male, su una tabella piccola, risponde in fretta. Poi passano i mesi. Gli ordini diventano decine di migliaia, i log dei plugin si accumulano, le revisioni dei contenuti si moltiplicano, le tabelle dei metadati arrivano a milioni di righe. La stessa query, senza che nessuno abbia toccato una riga di codice, impiega dieci o cento volte di più.

Nel frattempo si aggiungono altri plugin, ciascuno con le sue interrogazioni a ogni pagina, e il traffico aumenta, magari proprio grazie al successo del sito. Il risultato è un degrado lento e costante, che nessuno nota finché non supera una soglia: il giorno del Black Friday, durante una campagna, dopo un’uscita sui social. A quel punto la cache non basta più, perché il traffico si sposta sulle pagine che non può coprire, e il server crolla nel momento in cui servirebbe di più.

Per questo l’ottimizzazione applicativa non è un intervento da fare una volta sola, ma un’abitudine: misurare periodicamente, tenere sotto controllo la crescita delle tabelle, rivedere le query più costose quando i dati cambiano di ordine di grandezza.

Cosa facciamo in Managed Server

In Managed Server abbiamo scelto di non fermarci al server. Ottimizziamo naturalmente lo stack: web server, PHP-FPM, cache applicative come Redis, reverse proxy come Varnish, database, file system, rete. Ma quando il collo di bottiglia è nell’applicazione, entriamo nell’applicazione.

Il nostro lavoro segue un metodo preciso:

  1. misura: prima di toccare qualsiasi cosa, raccogliamo dati reali. Tempi di risposta per tipo di pagina, distinguendo le pagine servite dalla cache da quelle generate, carico del database, processi PHP impegnati;
  2. profilazione: con strumenti APM dove disponibili, e sempre con il log delle richieste PHP lente e quello delle query lente di MySQL, MariaDB o PostgreSQL, individuiamo dove va davvero il tempo;
  3. individuazione dei colli di bottiglia: la query senza indice, il plugin che fa decine di interrogazioni, la tabella cresciuta senza controllo, la chiamata esterna sincrona, la configurazione di PHP inadatta al carico;
  4. risoluzione: indici, riscrittura delle query, pulizia del database, configurazione di PHP e del database su misura, cache applicativa dove ha senso, sostituzione o correzione dei componenti responsabili;
  5. verifica: rimisuriamo con gli stessi criteri dell’inizio, perché un’ottimizzazione senza numeri è solo un’opinione.

Solo dopo, sopra un’applicazione che risponde in tempi ragionevoli anche senza cache, la web cache diventa ciò che deve essere: un acceleratore che porta le pagine pubbliche a pochi millisecondi e protegge il server nei picchi, non un tappeto sotto cui nascondere quattro secondi di inefficienza.

È lo stesso approccio che abbiamo applicato al nostro sito, come abbiamo raccontato nella cronaca di una vera ottimizzazione: si parte dai numeri, si cerca la causa, si interviene sulla causa.

Un consiglio a chi commissiona un sito

Se state per commissionare un sito o un e-commerce, chiedete a chi lo realizza come verificherà le prestazioni lato server, non solo il punteggio di PageSpeed. Chiedete quanto impiega a generarsi una pagina senza cache, quante query esegue la pagina più visitata, cosa succede con diecimila prodotti invece di cento. Le risposte vi diranno molto più di un portfolio.

E se il sito è già online e lento, diffidate di chi vi propone come unica soluzione un piano più costoso o una cache più “intelligente”. A volte serve davvero più potenza; molto più spesso serve qualcuno che sollevi il tappeto e guardi cosa c’è sotto.

Conclusioni

La web cache è uno degli strumenti più efficaci che abbiamo, e la usiamo su tutti i progetti che gestiamo. Ma è un acceleratore, non una cura. Un sito che impiega quattro secondi a generare una pagina resta un sito che impiega quattro secondi, solo che il problema si manifesta nei momenti peggiori: al checkout, durante i picchi, nell’area clienti, sotto l’assalto dei bot.

Le prestazioni vere nascono dalle basi: capire il costo delle operazioni, progettare bene il database, usare gli indici, misurare prima di intervenire. Quando queste basi mancano nello sviluppo, servono competenze capaci di recuperarle a valle. Se il tuo sito è lento e nessuno finora ha saputo dirti perché, parliamone: con la nostra consulenza su MySQL e MariaDB, l’ottimizzazione delle prestazioni e i nostri server gestiti lavoriamo su tutto lo stack, dal database all’applicazione, fino alla cache.

Hai dei dubbi? Non sai da dove iniziare? Contattaci !

Abbiamo tutte le risposte alle tue domande per aiutarti nella giusta scelta.

Chatta con noi

Chatta direttamente con il nostro supporto prevendita.

0256569681

Contattaci telefonicamente negli orari d’ufficio 9:30 – 19:30

Contattaci online

Apri una richiesta direttamente nell’area dei contatti.

DISCLAIMER, Note Legali e Copyright. Red Hat, Inc. detiene i diritti su Red Hat®, RHEL®, RedHat Linux®, e CentOS®; AlmaLinux™ è un marchio di AlmaLinux OS Foundation; Rocky Linux® è un marchio registrato di Rocky Linux Foundation; SUSE® è un marchio registrato di SUSE LLC; Canonical Ltd. detiene i diritti su Ubuntu®; Software in the Public Interest, Inc. detiene i diritti su Debian®; Linus Torvalds detiene i diritti su Linux®; FreeBSD® è un marchio registrato di The FreeBSD Foundation; NetBSD® è un marchio registrato di The NetBSD Foundation; OpenBSD® è un marchio registrato di Theo de Raadt; Oracle Corporation detiene i diritti su Oracle®, MySQL®, MyRocks®, VirtualBox® e ZFS®; Percona® è un marchio registrato di Percona LLC; MariaDB® è un marchio registrato di MariaDB Corporation Ab; PostgreSQL® è un marchio registrato di PostgreSQL Global Development Group; SQLite® è un marchio registrato di Hipp, Wyrick & Company, Inc.; KeyDB® è un marchio registrato di EQ Alpha Technology Ltd.; Typesense® è un marchio registrato di Typesense Inc.; REDIS® è un marchio registrato di Redis Labs Ltd; F5 Networks, Inc. detiene i diritti su NGINX® e NGINX Plus®; Varnish® è un marchio registrato di Varnish Software AB; HAProxy® è un marchio registrato di HAProxy Technologies LLC; Traefik® è un marchio registrato di Traefik Labs; Envoy® è un marchio registrato di CNCF; Adobe Inc. detiene i diritti su Magento®; PrestaShop® è un marchio registrato di PrestaShop SA; Shopware® è un marchio registrato di shopware AG; OpenCart® è un marchio registrato di OpenCart Limited; Automattic Inc. detiene i diritti su WordPress®, WooCommerce®, e JetPack®; Open Source Matters, Inc. detiene i diritti su Joomla®; Dries Buytaert detiene i diritti su Drupal®; Shopify® è un marchio registrato di Shopify Inc.; BigCommerce® è un marchio registrato di BigCommerce Pty. Ltd.; TYPO3® è un marchio registrato di TYPO3 Association; Ghost® è un marchio registrato di Ghost Foundation; Amazon Web Services, Inc. detiene i diritti su AWS® e Amazon SES®; Google LLC detiene i diritti su Google Cloud™, Chrome™, e Google Kubernetes Engine™; Alibaba Cloud® è un marchio registrato di Alibaba Group Holding Limited; DigitalOcean® è un marchio registrato di DigitalOcean, LLC; Linode® è un marchio registrato di Linode, LLC; Vultr® è un marchio registrato di The Constant Company, LLC; Akamai® è un marchio registrato di Akamai Technologies, Inc.; Fastly® è un marchio registrato di Fastly, Inc.; Let’s Encrypt® è un marchio registrato di Internet Security Research Group; Microsoft Corporation detiene i diritti su Microsoft®, Azure®, Windows®, Office®, e Internet Explorer®; Mozilla Foundation detiene i diritti su Firefox®; Apache® è un marchio registrato di The Apache Software Foundation; Apache Tomcat® è un marchio registrato di The Apache Software Foundation; PHP® è un marchio registrato del PHP Group; Docker® è un marchio registrato di Docker, Inc.; Kubernetes® è un marchio registrato di The Linux Foundation; OpenShift® è un marchio registrato di Red Hat, Inc.; Podman® è un marchio registrato di Red Hat, Inc.; Proxmox® è un marchio registrato di Proxmox Server Solutions GmbH; VMware® è un marchio registrato di Broadcom Inc.; CloudFlare® è un marchio registrato di Cloudflare, Inc.; NETSCOUT® è un marchio registrato di NETSCOUT Systems Inc.; ElasticSearch®, LogStash®, e Kibana® sono marchi registrati di Elastic N.V.; Grafana® è un marchio registrato di Grafana Labs; Prometheus® è un marchio registrato di The Linux Foundation; Zabbix® è un marchio registrato di Zabbix LLC; Datadog® è un marchio registrato di Datadog, Inc.; Ceph® è un marchio registrato di Red Hat, Inc.; MinIO® è un marchio registrato di MinIO, Inc.; Mailgun® è un marchio registrato di Mailgun Technologies, Inc.; SendGrid® è un marchio registrato di Twilio Inc.; Postmark® è un marchio registrato di ActiveCampaign, LLC; cPanel®, L.L.C. detiene i diritti su cPanel®; Plesk® è un marchio registrato di Plesk International GmbH; Hetzner® è un marchio registrato di Hetzner Online GmbH; OVHcloud® è un marchio registrato di OVH Groupe SAS; Contabo® è un marchio registrato di Contabo GmbH; IONOS® è un marchio registrato di IONOS SE; International Business Machines Corporation detiene i diritti su IBM® e IBM Cloud®; Terraform® è un marchio registrato di HashiCorp, Inc.; Ansible® è un marchio registrato di Red Hat, Inc.; cURL® è un marchio registrato di Daniel Stenberg; Facebook®, Inc. detiene i diritti su Facebook®, Messenger® e Instagram®. Questo sito non è affiliato, sponsorizzato o altrimenti associato a nessuna delle entità sopra menzionate e non rappresenta nessuna di queste entità in alcun modo. Tutti i diritti sui marchi e sui nomi di prodotto menzionati sono di proprietà dei rispettivi detentori di copyright. Ogni altro marchio citato appartiene ai propri registranti. MANAGED SERVER® è un marchio registrato a livello europeo da MANAGED SERVER SRL, con sede legale in Via Flavio Gioia, 6, 62012 Civitanova Marche (MC), Italia e sede operativa in Via Enzo Ferrari, 9, 62012 Civitanova Marche (MC), Italia.

SOLO UN ATTIMO !

Ti sei mai chiesto se il tuo Hosting faccia schifo ?

Scopri subito se il tuo hosting provider ti sta danneggiando con un sito lento degno del 1990 ! Risultato immediato.

Close the CTA
Torna in alto