wp-note

Sviluppo Siti Web

Ottimizzare il database di WordPress

Plugin utili per il debug e l’ottimizzazione del database di WordPress:

  • Query Monitor è un plugin indispensabile per ogni sviluppatore WordPress che desidera ottimizzare le prestazioni del proprio sito web. Questo strumento potente e versatile offre un’analisi dettagliata delle query del database, dei tempi di caricamento delle pagine, dei hook e delle funzioni utilizzate, permettendo di individuare eventuali colli di bottiglia o problemi di performance. Con Query Monitor, si può avere un quadro completo e dettagliato di ciò che accade dietro le quinte del sito
  • WP-Optimize – Cache, Clean, Compress questo strumento all-in-one offre una serie di funzionalità per ottimizzare il sito, tra cui la pulizia del database, la compressione delle immagini e la gestione della cache. Una delle sue caratteristiche più potenti è la capacità di pulire il database eliminando le tabelle lasciate da plugin disinstallati. Questo significa che WP-Optimize può aiutarti a liberare spazio sul database, migliorando la velocità e l’efficienza del sito
  • WP phpMyAdmin plugin permette di eseguire query SQL, creare e modificare tabelle, importare ed esportare dati, e molto altro ancora. Questo plugin è molto utili se l’hosting provider non fornisce phpMyAdmin. Attenzione non sempre funziona dipende dall’hosting

Step 1: Verificare le query eseguite

Con il plugin Query Monitor verificare:

  • Il numero di query eseguite sulla pagina. Solitamente in un piccolo sito, il numero normale di query è di 60 query per pagina.
  • Analizzare se le query vengono fatte da specifici plugin e verificare se ci sono alternative più performanti
  • Verificare la presenza delle query lente (slow query) e tentare di salvare i risultati in Object Cache (WP_Object_Cache)
  • Verificare la presenza di query duplicate

Ovviamente possiamo fare tutte le ottimizzazioni del mondo ma se abbiamo un hosting scadente non andremo da nessuna parte.

Step 2: Utilizzare Object Caching


L’Object Caching è una componente fondamentale del sistema di caching di WordPress, progettata per migliorare le prestazioni del tuo sito riducendo il carico sul database. Quando WordPress esegue una query al database, il risultato viene memorizzato, o “cache”, per un utilizzo futuro. Se la stessa query viene eseguita di nuovo, WordPress può recuperare il risultato dalla cache invece di interrogare di nuovo il database, risparmiando tempo e risorse. Questo è particolarmente utile per le query che vengono eseguite frequentemente e che restituiscono gli stessi risultati, come le query per le opzioni del sito o i dati dei post.

L’Object Caching di base in WordPress è di natura non persistente (i dati memorizzati nella cache vengono cancellati alla fine della richiesta), molti plugin di Object Caching offrono la possibilità di rendere la cache persistente. Questo significa che i dati memorizzati nella cache rimarranno disponibili tra le richieste.

Per sfruttare appieno la persistenza della cache, è importante considerare alcune caratteristiche dell’hosting:

  1. Supporto per la persistenza della cache: Non tutti gli hosting supportano la persistenza della cache. Alcuni hosting condivisi, ad esempio, potrebbero non offrire questa funzionalità. Prima di scegliere un hosting, verifica se supporta la persistenza della cache.
  2. Redis / Memcached: Alcuni server possono essere configurati per ottimizzare la persistenza della cache. Ad esempio, potresti essere in grado di configurare il tuo server per utilizzare Memcached o Redis, che sono sistemi di memorizzazione nella cache ad alte prestazioni.

Step 3: Rimuovere tabelle create dai plugin non più utilizzati

Il plugin WP-Optimize è uno strumento da utilizzare per mantenere il tuo sito WordPress pulito e ottimizzato. Una delle sue funzionalità più potenti è la capacità di rimuovere le tabelle del database create da plugin che non sono più in uso. Queste tabelle possono occupare spazio prezioso nel tuo database e potenzialmente rallentare il tuo sito, quindi la loro rimozione può aiutare a migliorare le prestazioni. Tuttavia, è importante procedere con cautela quando si rimuovono le tabelle del database. Prima di utilizzare WP-Optimize per rimuovere le tabelle, è fortemente consigliato eseguire un backup completo del tuo sito. Questo ti permetterà di ripristinare il tuo sito al suo stato precedente nel caso in cui qualcosa dovesse andare storto durante il processo di pulizia.

Step 4: Ottimizzazione delle tabelle

L’ottimizzazione delle tabelle del database è un aspetto fondamentale per mantenere il tuo sito WordPress veloce e reattivo. Un modo efficace per ottimizzare le tabelle è utilizzare il motore di database InnoDB. InnoDB è un motore di storage per MySQL che offre una serie di vantaggi rispetto ad altri motori, come MyISAM. In particolare, InnoDB supporta le transazioni, che permettono di raggruppare più operazioni in un’unica operazione atomica. Inoltre, InnoDB utilizza una tecnica chiamata ‘row-level locking’, che può migliorare le prestazioni quando si eseguono molte operazioni di scrittura.

WP-Optimize, offrono la possibilità di convertire le tabelle del database in InnoDB. Come sempre quando si lavora con il database, è importante fare un backup completo prima di apportare modifiche.

Step 5: Individuare le tabelle di maggiori dimensioni

Per individuare le tabelle di maggiori dimensioni nel tuo database utilizzando phpMyAdmin. Dopo aver selezionato il database, vedrai un elenco di tutte le tabelle nel database. In alto, clicca sulla scheda “Struttura”. In questa vista, vedrai un elenco di tutte le tabelle nel tuo database insieme a diverse informazioni su ciascuna tabella, tra cui il numero di righe, il tipo di tabella, la dimensione.

Per esempio, se noti che la tabella wp_woocommerce_sessions è diventata molto grande, potrebbe essere dovuto al fatto che contiene molte sessioni obsolete che non sono state pulite. WooCommerce dovrebbe pulire automaticamente le sessioni obsolete, ma a volte questo processo può non funzionare come previsto, ad esempio a causa di un conflitto con un altro plugin o di un problema di configurazione del server.

Step 6: Rimuovere dati non necessari

Una parte importante di questa pulizia riguarda la rimozione dei dati non necessari. Questi possono includere revisioni dei post, bozze non pubblicate, elementi nel cestino, commenti non approvati o spam, e dati transitori.
Le revisioni dei post e le bozze possono accumularsi rapidamente se crei o modifichi frequentemente i contenuti. Mentre possono essere utili per tenere traccia delle modifiche o salvare il lavoro in corso, non sono necessarie una volta che il contenuto è stato pubblicato e possono occupare spazio prezioso nel tuo database.

Gli elementi nel cestino, come post o pagine eliminate, sono un altro tipo di dati che possono essere puliti regolarmente. Se sai che non avrai bisogno di ripristinare questi elementi, svuotare il cestino può liberare spazio nel tuo database.

I commenti non approvati o segnalati come spam possono anche accumularsi nel tempo, specialmente se il tuo sito riceve molto traffico.

Infine, i dati transitori in WordPress sono dati temporanei memorizzati nel tuo database. Mentre questi dati possono migliorare le prestazioni memorizzando i risultati delle query del database, possono diventare obsoleti o non necessari nel tempo.

Puoi utilizzare WP-Optimize per automatizzare il processo di pulizia, rendendo più facile mantenere il tuo sito WordPress pulito e ottimizzato.

Puoi anche decidere di eliminare il problema alla base impostando nel file wp-config.php le seguenti impostazioni:

Disabilitare le revisioni dei post: Puoi disabilitare completamente le revisioni dei post aggiungendo la seguente linea al tuo file wp-config.php:

define('WP_POST_REVISIONS', false);

Limitare il numero di revisioni dei post: Se vuoi mantenere le revisioni dei post ma limitare il loro numero, puoi farlo con una linea simile a questa:

define('WP_POST_REVISIONS', 3);

Questo limiterà il numero di revisioni per post a 3.

Cambiare la durata dei dati transitori: I dati transitori in WordPress hanno una durata predefinita illimitata cioè rimarranno nel database fino a quando non verrà esplicitamente eliminato o fino a quando non verrà sovrascritto da un nuovo valore.
Se vuoi cambiare il valore predefinito puoi definire la costante WP_SITE_TRANSIENT_EXPIRATION. Ad esempio, per impostare la durata dei dati transitori a 3 ore, potresti aggiungere la seguente linea:

define('WP_SITE_TRANSIENT_EXPIRATION', 3 * HOUR_IN_SECONDS);

HOUR_IN_SECONDS è una costante predefinita in WordPress che rappresenta il numero di secondi in un’ora. È definita come 3600, che è il numero di secondi in un’ora (60 secondi per minuto * 60 minuti per ora).

Step 7: Ottimizzare le query

Se stai sviluppando un plugin per WordPress, l’utilizzo di funzioni come wp_cache_set() e set_transient() può essere un ottimo modo per ottimizzare le prestazioni del tuo plugin. Queste funzioni ti permettono di memorizzare temporaneamente i dati, riducendo così la necessità di eseguire query al database costose o operazioni di calcolo intensive.

wp_cache_set()

La funzione wp_cache_set() fa parte del sistema di Object Cache di WordPress. Questa funzione memorizza un valore nella cache per un periodo di tempo specificato. Tuttavia, la cache di oggetti di WordPress è non persistente, il che significa che i dati memorizzati nella cache vengono cancellati alla fine della richiesta corrente. Ecco un esempio di come si potrebbe utilizzare wp_cache_set():

wp_cache_set( 'cache_key', 'cache_value', 'cache_group', 3600 );

In questo esempio, 'cache_key' è la chiave univoca per il dato in cache, 'cache_value' è il dato che si desidera memorizzare, 'cache_group' è un gruppo opzionale che può essere utilizzato per raggruppare oggetti correlati nella cache, e 3600 è la durata della cache in secondi.

Noterai che ho specificato la durata della cache ma ti ho anche detto che:

i dati memorizzati nella cache vengono cancellati alla fine della richiesta corrente

Che senso ha? Risposta:

La cache di WordPress, di default, non è persistente e i dati memorizzati in cache vengono cancellati alla fine della richiesta corrente. In questo contesto, specificare una durata per wp_cache_set() non ha effetto perché i dati verranno comunque cancellati alla fine della richiesta.

Tuttavia, WordPress supporta l’uso di plugin di cache di oggetti persistenti, come Redis o Memcached. Quando si utilizza un plugin di cache di oggetti persistente, i dati memorizzati in cache possono sopravvivere oltre la richiesta corrente e la durata specificata in wp_cache_set() diventa rilevante. In questo caso, la durata determina quanto tempo i dati rimarranno nella cache prima di essere automaticamente eliminati.

Quindi, mentre specificare una durata per wp_cache_set() potrebbe non avere effetto in un’installazione standard di WordPress, può essere utile se stai utilizzando un plugin di cache di oggetti persistente (vedi Step 2)

set_transient()

La funzione set_transient(), d’altra parte, fa parte del sistema Transients API di WordPress. Questa funzione memorizza un valore nel database per un periodo di tempo specificato. A differenza di wp_cache_set(), i dati memorizzati con set_transient() persistono tra le richieste. Ecco un esempio di come si potrebbe utilizzare set_transient():

set_transient( 'transient_key', 'transient_value', 3600 );

In questo esempio, 'transient_key' è la chiave univoca per il dato transitorio, 'transient_value' è il dato che si desidera memorizzare, e 3600 è la durata del transitorio in secondi.

Esempio pratico

Immagina di avere una funzione nel tuo plugin che esegue una query al database per recuperare una lista di post. Eseguire questa query ogni volta che la funzione viene chiamata potrebbe rallentare il tuo sito, specialmente se la lista di post è grande. Tuttavia, potresti utilizzare wp_cache_set() per memorizzare il risultato della query nella cache e riutilizzarlo nelle richieste successive.

Ecco un esempio di come potresti farlo:

//!Codice non acora ottimizzato

function get_my_posts() {
    // Ottieni i post dalla cache
    $posts = wp_cache_get( 'my_posts' );

    // Se non c'è nulla in cache eseguo la query
    if ( false === $posts ) {
        $posts = new WP_Query(  
          'posts_per_page'   => -1,
          'post_type'        => 'post'
        ); 
        wp_cache_set( 'my_posts', $posts );
    }

    return $posts;
}

In questo esempio, la funzione get_my_posts() prima cerca il risultato nella cache. Se il risultato non è nella cache, esegue la query e memorizza il risultato nella cache per le richieste future. Questo può aiutare a ridurre il carico sul tuo database e a migliorare le prestazioni del tuo sito.

Non memorizzare l’oggetto WP_Query

Memorizzare un oggetto WP_Query intero nella cache potrebbe non essere l’approccio più efficiente, specialmente se l’oggetto è molto grande. Invece, potrebbe essere più utile memorizzare solo i dati effettivamente necessari. Ad esempio, potresti voler memorizzare solo gli ID dei post restituiti dalla query.

Ecco un esempio modificato che memorizza solo gli ID dei post:

function get_my_post_ids() {
    // Ottieni i post dalla cache
    $post_ids = wp_cache_get( 'my_post_ids' );

    // Se non c'è nulla in cache eseguo la query
    if ( false === $post_ids ) {
       $posts = new WP_Query(  
          'posts_per_page'   => -1,
          'post_type'        => 'post'
        ); 
        $post_ids = wp_list_pluck( $query->posts, 'ID' );
        wp_cache_set( 'my_post_ids', $post_ids );
    }

    return $post_ids;
}

Una volta che hai gli ID dei post memorizzati in cache, dovrai eseguire una nuova query per ottenere i dati completi dei post quando ne hai bisogno. Tuttavia, eseguire una query per un insieme specifico di ID di post è generalmente molto più veloce che eseguire una query più complessa.

Ecco un esempio di come potresti fare:

function get_my_posts() {
    $post_ids = get_my_post_ids();

    $posts = [];
    foreach ( $post_ids as $post_id ) {
        $post = get_post( $post_id );
        if ( $post ) {
            $posts[] = $post;
        }
    }

    return $posts;
}

In questo esempio, la funzione get_my_posts() recupera gli ID dei post dalla cache utilizzando la funzione get_my_post_ids(). Quindi, per ogni ID di post, recupera il post completo utilizzando la funzione get_post(). Questo ti dà un array di oggetti post completi, proprio come se avessi eseguito una query WP_Query.

Ricorda, tuttavia, che anche se questo metodo può essere più veloce per alcune query, potrebbe non essere sempre il più efficiente. La memorizzazione nella cache è uno strumento potente, ma deve essere utilizzato con attenzione e comprensione. È sempre una buona idea testare le prestazioni del tuo codice in vari scenari per assicurarti che stai ottenendo i benefici che ti aspetti dalla memorizzazione nella cache.

Step 8: Attenzione agli autoload

L’opzione autoload in WordPress è una caratteristica importante che può avere un impatto significativo sulle prestazioni del tuo sito. Quando aggiungi un’opzione al database di WordPress utilizzando la funzione add_option(), hai la possibilità di impostare il parametro autoload su true o false. Se autoload è impostato su true, l’opzione verrà caricata automaticamente all’avvio di WordPress. Questo significa che l’opzione sarà immediatamente disponibile per l’uso senza dover eseguire una query al database.

Mentre l’autoload può essere molto utile per le opzioni che devono essere utilizzate frequentemente, può anche causare problemi di prestazioni se viene abusato. Se hai molte opzioni con autoload impostato su true, WordPress dovrà eseguire una grande query al database ogni volta che si avvia. Questo può rallentare il tuo sito, specialmente se il tuo database è grande o se il tuo hosting non è ottimizzato per WordPress.

Per identificare le opzioni che pesano di più nel tuo database WordPress, puoi eseguire una query SQL che ordina le opzioni per la loro dimensione. Ecco un esempio di tale query:

SELECT option_name, length(option_value) AS option_value_length
FROM wp_options
WHERE autoload='yes'
ORDER BY option_value_length DESC;

Questa query seleziona il nome dell’opzione e la lunghezza del valore dell’opzione da wp_options dove autoload è impostato su ‘yes’. Quindi ordina i risultati in base alla lunghezza del valore dell’opzione in ordine decrescente, il che significa che le opzioni più grandi saranno elencate per prime.

Ricorda che dovresti sostituire wp_ con il prefisso della tabella del tuo database se è diverso da wp_.

In conclusione, ottimizzare il tuo sito WordPress richiede una comprensione approfondita di come funzionano le varie componenti del sistema, tra cui la cache di oggetti, i transitori, l’autoload delle opzioni e il database. Utilizzare funzioni come wp_cache_set() e set_transient(), gestire attentamente le opzioni autoload e mantenere pulito il tuo database sono tutti passaggi importanti per garantire che il tuo sito funzioni al meglio delle sue capacità. Ricorda, tuttavia, che ogni sito è unico e ciò che funziona per un sito potrebbe non funzionare per un altro. È importante testare le modifiche, monitorare le prestazioni e fare aggiustamenti in base alle esigenze specifiche del tuo sito. E, come sempre, assicurati di fare un backup del tuo sito prima di apportare modifiche significative. Con la giusta attenzione e cura, puoi garantire che il tuo sito WordPress sia veloce, efficiente e pronto a servire i tuoi visitatori.

Risorse Utili:


Pubblicato

in

,

da

Tag:

Commenti

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *