27 Maggio 2022

Ottimizzazione delle prestazioni di WordPress Parte 1: conosci le tue query sul database

Come ottimizzare le Query più impegnative su WordPress ?

SQL Banner

Ci sono molte cattive abitudini che gli sviluppatori di WordPress dovrebbero evitare. Alcuni di questi includono l’uso dell’asterisco (*) per query SELECT  , query ridondanti e, soprattutto, non avere abbastanza familiarità con SQL.

Dopo anni di sviluppo su siti Web aziendali, gli sviluppatori spesso si pongono le seguenti domande:

  • Perché non conoscevo questo metodo prima?
  • Come potevo cavarmela prima?

La maggior parte degli sviluppatori che lavorano su WordPress riconosceranno che WordPress ha:

  • Problemi di ottimizzazione costanti
  • Problemi di scalabilità che possono causare interruzioni del sito
  • Plugin di terze parti che creano carichi di database elevati

È pratica comune per uno sviluppatore di WordPress limitare la quantità di plugin installati e attivati sul proprio sito web. Il sovraccarico che un cattivo plug-in può infliggere a un sito Web è inimmaginabile. Quando ti affidi a plug-in di terze parti, le prestazioni del tuo sito Web sono alla mercé di quegli sviluppatori di terze parti. Se non hai una comprensione del codice nel plug-in, il plug-in potrebbe contenere una query inefficiente che potrebbe potenzialmente bloccare il tuo sito web. I plug-in inefficienti sono particolarmente difficili da rintracciare e potrebbero essere necessarie settimane per capire la causa del rallentamento del tuo sito.

L’argomento dell’ottimizzazione delle prestazioni può essere un argomento molto ampio da trattare. Invece di affrontare tutto in una volta, cercherò di affrontare una query di impaginazione che ha creato problemi di scalabilità per molti sviluppatori di WordPress. Questa è una query che vediamo spesso quando sviluppiamo su un sito WordPress.

Invece di dare immediatamente la soluzione, facciamo questo esercizio insieme.

Prenditi un momento e identifica 10 cose che puoi ottimizzare per questa seguente query:

SELECT SQL_CALC_FOUND_ROWS wp_posts.*, wp_postmeta.*
FROM wp_posts
INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
WHERE 1=1 AND ( wp_term_relationships.term_taxonomy_id IN (554) ) 
AND wp_posts.post_type = 'post' 
AND (wp_posts.post_status != 'draft' || wp_posts.post_status <> 'private' || wp_posts.post_status != 'trash')
AND CAST(wp_postmeta.meta_value AS CHAR) = 'episodes'
GROUP BY wp_posts.ID 
ORDER BY wp_posts.post_date DESC 
LIMIT 0, 10;
SELECT FOUND_ROWS();

Ecco un approccio migliore:

    • 1. wp_posts.* => wp_posts.post_title, wp_posts.post_content, wp_posts.post_name, wp_posts.post_date, wp_postmeta.meta_key, wp_postmeta.meta_valueElenca solo le colonne di cui hai bisogno. Più colonne hai elencato, più grande diventa il tuo oggetto per la memoria.
    • 2. WHERE 1=1 sarà sempre vero. Questa è una clausola ridondante. Ho sempre seguito la filosofia di mantenere le cose brevi e semplici! Segui il principio KISS. Se stai costruendo una clausola WHERE al volo e non sei sicuro di aver bisogno di espressioni aggiuntive nella  clausola WHERE , un 1=1 alla fine assicura che creerai una clausola WHERE valida in modo che l’istruzione SELECT  non esploda.
    • 3. wp_term_relationships.term_taxonomy_id IN (554)Per questa specifica affermazione, è inclusa solo 1 tassonomia. L’uso diretto di ‘=’  è il migliore per le prestazioni, seguito da IN.  Se sono presenti più di 2 tassonomie da chiamare, utilizzare  IN . OR è il più lento.
    • 4. (wp_posts.post_status != ‘draft’ || wp_posts.post_status <> ‘private’ || wp_posts.post_status != ‘trash’)!= AND <> sono entrambi terribili per le prestazioni, puoi ottenere gli stessi risultati usando wp_posts.post_status = ‘publish’ .
    • 5. CAST(wp_postmeta.meta_value AS CHAR) = ‘episodes’Questo è complicato perché meta_value è un tipo LONGTEXT e non è indicizzato dallo schema del database. L’utilizzo di questa coppia chiave/valore è leggermente più pesante in termini di risorse rispetto a meta_key o post_id nella tabella wp_postmeta .
    • 6. GROUP BY wp_posts.IDL’uso di GROUP BY può richiedere prestazioni elevate. Immagina l’algoritmo di ordinamento che deve essere eseguito per ottenere il set di dati di ritorno corretto.
    • 7. ORDER BY wp_posts.post_date DESC.ASC è la clausola ORDER BY predefinita . Il DESC sta sostanzialmente invertendo l’ordine cronologicamente, richiedendo l’esecuzione di un algoritmo aggiuntivo.
    • 8. LIMIT 0, 10L’uso del metodo offset può essere pessimo per le prestazioni. MySQL è in genere inadeguato per offset elevati . Immagina lo scenario  LIMIT 200000, 10 . Questo può essere problematico quando si impagina su una tabella intera memorizzando tutte le righe in memoria. Prendi in considerazione l’idea di incapsulare la query per consentire al sistema di leggere alcune righe alla volta. Una soluzione consiste nell’utilizzare un ID indicizzato “autoincrement” come alternativa.
    • 9. ‘OR’ è moderatamente più veloce in una frazione di secondo rispetto a ‘||’. Un altro vantaggio è la leggibilità. 
    • 10. SELECT FOUND_ROWS()Esecuzione di query inutili. Ciò avrebbe potuto essere ottenuto con una singola query efficiente.

Spero che questa prima parte della serie di prestazioni di WordPress ti sia piaciuta. Resta sintonizzato per la seconda parte.

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.

INFORMAZIONI

Managed Server S.r.l. è un player italiano di riferimento nel fornire soluzioni avanzate di sistemistica GNU/Linux orientate all’alta performance. Con un modello di sottoscrizione dai costi contenuti e prevedibili, ci assicuriamo che i nostri clienti abbiano accesso a tecnologie avanzate nel campo dell’hosting, server dedicati e servizi cloud. Oltre a questo, offriamo consulenza sistemistica su sistemi Linux e manutenzione specializzata in DBMS, IT Security, Cloud e molto altro. Ci distinguiamo per l’expertise in hosting di primari CMS Open Source come WordPress, WooCommerce, Drupal, Prestashop, Joomla, OpenCart e Magento, affiancato da un servizio di supporto e consulenza di alto livello adatto per la Pubblica Amministrazione, PMI, ed aziende di qualsiasi dimensione.

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®, e MyRocks®; Percona® è un marchio registrato di Percona LLC; MariaDB® è un marchio registrato di MariaDB Corporation Ab; 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. Adobe Inc. detiene i diritti su Magento®; PrestaShop® è un marchio registrato di PrestaShop SA; 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®. Amazon Web Services, Inc. detiene i diritti su AWS®; Google LLC detiene i diritti su Google Cloud™ e Chrome™; Facebook, Inc. detiene i diritti su Facebook®; Microsoft Corporation detiene i diritti su Microsoft®, Azure®, e Internet Explorer®; Mozilla Foundation detiene i diritti su Firefox®. Apache® è un marchio registrato di The Apache Software Foundation; PHP® è un marchio registrato del PHP Group. 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. 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 Via Enzo Ferrari, 9 62012 Civitanova Marche (MC) Italia.

SOLO UN ATTIMO !

Vorresti vedere come gira il tuo WooCommerce sui nostri sistemi senza dover migrare nulla ? 

Inserisci l'indirizzo del tuo sito WooCommerce e otterrai una dimostrazione navigabile, senza dover fare assolutamente nulla e completamente gratis.

No grazie, i miei clienti preferiscono il sito lento.
Torna in alto