Baza de date WordPress: optimizare și curățare, la ce nimeni nu se gândește

Ai instalat cache, ai adăugat un CDN, ai optimizat imaginile în format WebP, ai verificat Core Web Vitals — și site-ul tot pare mai lent decât ar trebui, mai ales în zona de administrare, la editarea articolelor sau la încărcarea rapoartelor de vânzări dintr-un magazin WooCommerce. Cauza, în multe astfel de cazuri, nu are legătură cu nimic din ce ai verificat deja — stă îngropată în baza de date, tabelul invizibil care ține toată afacerea ta digitală funcțională, dar pe care aproape nimeni nu se gândește vreodată să-l cureți.

Am scris deja despre de ce e lent un site WordPress și despre cum funcționează cache-ul. Baza de date e piesa lipsă din acest puzzle — cea pe care majoritatea ghidurilor de optimizare o ignoră complet, deși efectul ei asupra performanței reale poate fi la fel de mare ca orice altă optimizare tehnică.

Ce e, de fapt, baza de date unui site WordPress

Fiecare site WordPress rulează pe o bază de date MySQL (sau varianta compatibilă MariaDB), organizată în zeci de tabele. Articolele, paginile, comentariile, setările, utilizatorii, metadatele produselor dintr-un magazin WooCommerce — absolut tot conținutul și toată configurația site-ului locuiesc acolo, nu în fișierele pe care le vezi când te conectezi prin FTP. La fiecare încărcare de pagină, WordPress trimite zeci, uneori sute, de interogări (queries) către această bază de date, pentru a aduna informația necesară afișării paginii respective.

Aici apare legătura directă cu viteza: cu cât baza de date e mai mare, mai dezorganizată, sau conține mai multe date inutile amestecate cu cele relevante, cu atât fiecare interogare durează mai mult să găsească exact ce are nevoie. Diferența nu se simte neapărat dramatic pe un site mic, cu trafic redus — dar devine vizibilă rapid pe un magazin activ, pe un blog cu mii de articole, sau pe orice site care rulează de câțiva ani fără nicio curățare.

De ce cresc bazele de date fără să observi

Nimeni nu decide activ să „umple” baza de date cu date inutile — se întâmplă treptat, ca o consecință firească a modului în care funcționează WordPress și majoritatea plugin-urilor, fără nicio intervenție manuală necesară pentru ca acumularea să înceapă.

Reviziile automate ale articolelor. WordPress salvează automat o revizie nouă la fiecare editare semnificativă a unui articol sau a unei pagini, ca măsură de siguranță împotriva pierderii accidentale de conținut. Util în teorie, dar fără o limită configurată, un articol editat frecvent poate acumula zeci, uneori sute, de revizii identice sau aproape identice, fiecare ocupând spațiu și îngreunând orice interogare care atinge tabelul respectiv.

Transient-urile expirate, nesterse. Multe plugin-uri și teme folosesc „transients” — date temporare stocate în baza de date, cu un timp de expirare, folosite pentru cache intern sau date descărcate de la servicii externe. Problema: WordPress marchează transient-urile ca „expirate” la termenul stabilit, dar nu le șterge automat din baza de date decât în anumite condiții — mii de rânduri de date expirate, nefolosite, rămân acolo, ocupând spațiu la nesfârșit dacă nimeni nu intervine.

Comentarii spam și trackback-uri nesolicitate. Chiar și cu protecție anti-spam activă — subiect pe care l-am detaliat separat, pentru formularul de contact — comentariile spam prinse și marcate ca atare rămân, de multe ori, stocate în baza de date la nesfârșit, în loc să fie șterse definitiv periodic.

Tabele orfane, lăsate de plugin-uri dezinstalate. Multe plugin-uri creează propriile tabele în baza de date, pentru funcționalități specifice. Atunci când dezinstalezi un plugin, teoretic ar trebui să-și curețe și tabelele proprii — în practică, mulți dezvoltatori nu implementează corect acest pas, iar tabele întregi rămân „orfane” în baza de date, ani de zile după ce plugin-ul respectiv nu mai există nicăieri altundeva pe site.

Log-uri și date de urmărire acumulate. Plugin-uri de securitate, de analiză, de SEO sau de erori pot genera loguri detaliate, stocate direct în baza de date, care cresc constant fără o politică de ștergere automată a datelor mai vechi de o anumită perioadă.

Simptomele unei baze de date „umflate”

Recunoașterea problemei, înainte de a o rezolva, cere să știi la ce să te uiți. Zona de administrare (wp-admin) devine vizibil mai lentă decât încărcarea site-ului public — pentru că admin-ul face frecvent interogări mai complexe, mai afectate de dimensiunea și dezordinea bazei de date. Editarea sau publicarea articolelor durează neobișnuit de mult, mai ales pe articole editate frecvent, cu multe revizii acumulate. Backup-urile devin tot mai mari și tot mai lente de generat — subiect legat direct de ce am discutat în ghidul despre backup vs. versionare — pentru că un backup complet include, implicit, și tot balastul acumulat în baza de date.

Migrarea site-ului către un server nou durează neobișnuit de mult sau eșuează la limite de timp (timeout), exact din cauza volumului mare de date de transferat. Și, poate cel mai subtil semn, rapoartele dintr-un magazin WooCommerce sau statisticile din diverse plugin-uri devin tot mai lente de generat, pe măsură ce tabelele implicate cresc constant.

Autoload — cea mai subestimată problemă de performanță

Dacă ar fi să evidențiez o singură problemă tehnică, mai puțin cunoscută decât reviziile sau spam-ul, dar cu impact disproporționat de mare asupra vitezei, ar fi opțiunile marcate cu „autoload” activat, în tabelul wp_options. WordPress încarcă automat, la fiecare încărcare de pagină, absolut toate opțiunile marcate „autoload=yes” — indiferent dacă acea pagină specifică are nevoie de ele sau nu.

Multe plugin-uri, din neglijență sau din decizii tehnice discutabile, stochează cantități mari de date (uneori array-uri serializate complexe, cu mii de intrări) cu autoload activat implicit, fără niciun motiv real ca acele date să fie încărcate la fiecare pagină. Rezultatul: fiecare vizitator, pe fiecare pagină, declanșează încărcarea unui volum inutil de date din baza de date, chiar dacă pagina respectivă nu are nicio legătură cu plugin-ul care a generat acele opțiuni.

Cum verifici problema: un query simplu în baza de date (rulat de un administrator tehnic, niciodată la întâmplare, direct în producție, fără backup) poate identifica opțiunile cu autoload activat, sortate după dimensiune, evidențiind rapid care plugin-uri sunt responsabile pentru cea mai mare parte a datelor încărcate inutil la fiecare pagină.

Cum verifici sănătatea bazei de date, în siguranță

Înainte de orice intervenție, verificarea diagnostic nu prezintă niciun risc — presupune doar citirea informației existente, fără nicio modificare. Câteva metode accesibile, în funcție de nivelul tehnic disponibil:

Prin phpMyAdmin, disponibil în majoritatea panourilor de control cPanel. Poți vedea dimensiunea fiecărui tabel individual, sortate descrescător, pentru a identifica rapid care tabele au crescut disproporționat față de dimensiunea normală așteptată pentru site-ul tău.

Prin plugin-uri dedicate de curățare a bazei de date. Există plugin-uri specializate care oferă o interfață vizuală simplă pentru identificarea reviziilor acumulate, transient-urilor expirate, comentariilor spam nesterse și, în unele cazuri, chiar a opțiunilor cu autoload problematic. Utile pentru un prim diagnostic, mai ales pentru cineva fără acces direct sau confort tehnic cu phpMyAdmin.

Prin WP-CLI, pentru cei confortabili cu linia de comandă. Comenzi specifice pot afișa rapid dimensiunea tabelelor, numărul de revizii, transient-uri expirate, și pot chiar automatiza o parte din procesul de curățare, într-un mod mai controlat și mai transparent decât un plugin cu interfață vizuală.

Procesul corect de curățare, pas cu pas

Pasul 1 — backup complet, obligatoriu, înainte de orice modificare. Nicio operațiune de curățare a bazei de date nu ar trebui începută fără un backup recent, verificat funcțional — nu doar generat, ci confirmat că poate fi restaurat cu succes. Orice ștergere greșită, orice interpretare eronată a ce e „inutil” versus ce e, de fapt, necesar, poate deveni ireversibilă fără o plasă de siguranță.

Pasul 2 — limitarea numărului de revizii păstrate, pentru viitor. Dincolo de curățarea reviziilor deja acumulate, merită configurat un număr maxim de revizii păstrate per articol, pentru a preveni reacumularea aceleiași probleme în lunile următoare. Un număr rezonabil (de regulă undeva între 5 și 10 revizii per articol) oferă suficientă protecție împotriva pierderii accidentale de conținut, fără acumularea nelimitată actuală, implicită în WordPress.

Pasul 3 — ștergerea reviziilor vechi, excesive. Odată stabilită o limită pentru viitor, reviziile deja acumulate, peste acea limită, pot fi șterse în siguranță — conținutul curent al articolelor rămâne complet neafectat, doar istoricul redundant de versiuni intermediare dispare.

Pasul 4 — curățarea transient-urilor expirate. O operațiune sigură, pentru că, prin definiție, transient-urile expirate nu mai sunt folosite de nimic activ — WordPress și plugin-urile le vor regenera automat, dacă și când vor avea din nou nevoie de acele date temporare.

Pasul 5 — golirea definitivă a comentariilor spam și a coșului de gunoi. Comentariile deja marcate ca spam sau mutate la coș, dar niciodată șterse definitiv, pot fi eliminate complet, fără niciun risc pentru conținutul legitim al site-ului.

Pasul 6 — identificarea și eliminarea tabelelor orfane. Cel mai delicat pas din tot procesul, pentru că cere confirmarea clară că un tabel aparține, într-adevăr, unui plugin dezinstalat definitiv, nu unuia dezactivat temporar sau unuia activ care doar pare, la prima vedere, nefolosit. Verifică de două ori, întreabă-te dacă acel plugin ar putea fi reactivat vreodată, și abia apoi elimină tabelul, păstrând mereu backup-ul de la pasul 1 ca plasă de siguranță.

Pasul 7 — optimizarea structurală a tabelelor rămase. După curățarea datelor inutile, tabelele MySQL beneficiază de o operațiune de optimizare structurală (OPTIMIZE TABLE, pentru cei familiari cu comenzile SQL directe), care reorganizează fizic datele rămase, reducând fragmentarea acumulată și îmbunătățind viteza interogărilor viitoare.

Ce să NU faci niciodată în acest proces

Nu șterge tabele sau rânduri de date doar pentru că „par” nefolosite, fără verificare tehnică prealabilă atentă — o presupunere greșită poate strica funcționalități aparent nelegate, dacă relațiile din baza de date nu sunt înțelese corect. Nu folosi plugin-uri de curățare agresivă, configurate să șteargă automat, fără confirmare manuală, categorii largi de date — riscul unei ștergeri excesive, neintenționate, crește semnificativ fără control uman la fiecare pas important. Nu efectua niciodată operațiuni de curățare direct pe site-ul live, în perioadele de trafic ridicat — chiar și o operațiune sigură poate crea o blocare temporară (lock) pe tabele mari, afectând vizitatorii activi în acel moment.

Nu presupune că „mai multe date curățate înseamnă neapărat mai rapid” — anumite date, chiar dacă par voluminoase, pot fi esențiale funcționării corecte a site-ului; scopul e eliminarea balastului inutil, nu curățarea agresivă, oarbă, a tot ce pare, superficial, „prea mare”.

Un exemplu concret, anonimizat

Un magazin WooCommerce activ de câțiva ani, cu câteva mii de comenzi procesate, ajunsese la o bază de date de dimensiuni considerabil mai mari decât ar fi justificat volumul real de produse și conținut activ. La investigare, principalele cauze identificate: un plugin de analiză a comportamentului vizitatorilor, dezinstalat cu peste un an în urmă, dar care lăsase în urmă un tabel orfan cu milioane de rânduri de date de urmărire, niciodată curățat; articole de blog editate frecvent de-a lungul anilor, fără nicio limită configurată pentru numărul de revizii păstrate, acumulând, per articol, zeci de versiuni redundante; și o opțiune cu autoload activat, aparținând unui plugin de cache configurat greșit, care stoca un array serializat masiv, încărcat inutil la fiecare pagină, indiferent de relevanță.

După un proces de curățare atent, cu backup verificat înainte de fiecare pas, dimensiunea bazei de date a scăzut semnificativ, iar timpul de încărcare al zonei de administrare — cea mai afectată vizibil de problemă — s-a îmbunătățit considerabil, fără nicio altă modificare tehnică suplimentară pe partea de server sau cache. Diferența nu a venit dintr-o singură cauză izolată, ci din efectul cumulat al mai multor probleme mici, acumulate treptat, de-a lungul mai multor ani de funcționare fără nicio curățare structurată.

Cât de des merită repetat acest proces

Nu e o operațiune de făcut o singură dată și uitat definitiv — ca orice proces de mentenanță periodică, curățarea bazei de date merită integrată într-un calendar regulat, nu tratată ca o intervenție unică de urgență. Pentru majoritatea site-urilor de afaceri, cu activitate moderată, o verificare trimestrială, cu curățare la nevoie, oferă un echilibru rezonabil între efort investit și beneficiu real. Pentru magazine online active, cu volum mare de comenzi și conținut actualizat frecvent, o verificare lunară, chiar dacă rapidă, previne acumularea excesivă înainte să devină o problemă vizibilă pentru vizitatori.

Automatizarea limitei de revizii, făcută o singură dată, previne o parte semnificativă a problemei viitoare — nu mai trebuie să cureți manual, repetat, aceeași sursă de acumulare, dacă limitezi din start câte revizii se pot păstra per articol.

Legătura cu alte aspecte de performanță deja discutate

O bază de date curată nu înlocuiește nevoia de cache, CDN sau imagini optimizate — funcționează complementar cu toate acestea, nu în locul lor. Cache-ul, discutat în ghidul dedicat, reduce numărul de interogări către baza de date necesare pentru afișarea unei pagini deja generate anterior — dar pentru orice interogare care tot trebuie făcută (zona de administrare, rapoarte, căutări dinamice), o bază de date curată răspunde vizibil mai rapid decât una umflată de date inutile. Similar, un CDN și imagini optimizate reduc timpul de încărcare al resurselor statice, dar nu au niciun efect asupra vitezei interogărilor din baza de date — cele două categorii de optimizare rezolvă probleme diferite, complementare, nu concurente.

Cazul special al magazinelor WooCommerce

Un magazin WooCommerce activ acumulează probleme de bază de date semnificativ mai rapid decât un blog obișnuit, din cauza volumului de date generat de fiecare comandă procesată — informații despre produse, variații, stocuri, tranzacții, sesiuni de coș abandonate, și, adesea, integrări cu servicii de plată sau curierat care își stochează propriile date de urmărire. Câteva particularități specifice, dincolo de problemele generale discutate deja.

Sesiunile de coș abandonate. WooCommerce stochează date de sesiune pentru fiecare vizitator care adaugă produse în coș, chiar dacă acesta părăsește site-ul fără să finalizeze comanda. Fără o curățare periodică, aceste sesiuni expirate se acumulează constant, mai ales pe magazine cu trafic ridicat și rată de conversie normală (adică majoritatea vizitatorilor nu cumpără, dar mulți ajung să adauge produse în coș).

Tabelele de log pentru webhook-uri și integrări de plată. Multe plugin-uri de plată sau curierat păstrează un jurnal detaliat al fiecărei comunicări cu serviciul extern, util pentru depanare pe termen scurt, dar rareori necesar păstrat la nesfârșit. Verifică dacă plugin-urile de plată folosite au o opțiune de curățare automată a acestor log-uri mai vechi de o anumită perioadă (de regulă 30-90 de zile sunt suficiente pentru scopuri de depanare).

Comenzile de test, rămase din perioada de configurare inițială. Multe magazine păstrează, ani de zile, comenzi de test create în timpul configurării inițiale a plăților, niciodată șterse pentru că nimeni nu s-a mai gândit la ele — un detaliu minor individual, dar care se adaugă la volumul general de curățat.

Pentru magazinele mari, cu istoric bogat de comenzi reale (nu de test), merită luată în calcul și o strategie de arhivare, nu doar ștergere — comenzile vechi, finalizate cu ani în urmă, pot fi mutate într-un tabel de arhivă separat, accesibil la nevoie pentru raportări istorice, dar excluse din interogările curente, zilnice, care nu au nevoie de acel istoric complet pentru a funcționa rapid.

Unelte utile, în funcție de nivelul tehnic disponibil

Pentru cineva confortabil doar cu interfața vizuală a WordPress, plugin-urile dedicate de curățare a bazei de date oferă cea mai accesibilă cale de a începe — majoritatea afișează clar, într-un tabel simplu, câte revizii, transient-uri expirate sau comentarii spam există, cu opțiunea de a le șterge selectiv, cu un singur clic, fără nicio cunoștință tehnică suplimentară necesară.

Pentru cineva cu acces la panoul de control cPanel și un minim de confort tehnic, phpMyAdmin oferă control complet și vizibilitate directă asupra structurii bazei de date — util mai ales pentru identificarea tabelelor orfane, care rareori sunt detectate corect de plugin-urile automate, pentru că acestea nu pot ști, cu certitudine, cărui plugin (posibil dezinstalat) îi aparținea inițial un tabel necunoscut.

Pentru echipele tehnice sau agențiile care gestionează mai multe site-uri simultan — o realitate familiară oricui administrează, la fel ca noi, zeci de instalări WordPress —, WP-CLI oferă cea mai eficientă cale de a automatiza verificări și curățări repetate, prin scripturi care pot rula programat, periodic, fără intervenție manuală repetată pentru fiecare site în parte.

Indiferent de unealta aleasă, principiul rămâne același: verificare atentă înainte de acțiune, backup obligatoriu înainte de orice modificare, și o preferință clară pentru confirmarea manuală la fiecare pas important, în locul automatizării complete, oarbe, a deciziilor de ștergere.

Checklist final

1. Fă un backup complet, verificat funcțional, înainte de orice intervenție. 2. Verifică dimensiunea tabelelor, prin phpMyAdmin, plugin dedicat sau WP-CLI, pentru a identifica exact unde e problema. 3. Limitează numărul de revizii păstrate per articol, pentru a preveni reacumularea. 4. Șterge reviziile vechi excesive, transient-urile expirate și comentariile spam definitiv. 5. Identifică și elimină tabelele orfane, rămase de la plugin-uri dezinstalate — cu verificare atentă înainte de ștergere. 6. Verifică opțiunile cu autoload activat, disproporționat de mari, și ajustează-le sau raportează problema dezvoltatorului plugin-ului responsabil. 7. Optimizează structural tabelele rămase, după curățare. 8. Repetă procesul periodic — trimestrial pentru site-uri obișnuite, lunar pentru magazine online active.

O bază de date curată e una dintre acele optimizări invizibile pentru vizitatorul obișnuit, dar resimțite constant de tine și de echipa ta, de fiecare dată când editați conținut, generați rapoarte sau faceți un backup — exact genul de investiție care nu se vede în prezentări, dar se simte în fiecare zi de lucru pe site.

Dacă vrei să verificăm împreună starea reală a bazei de date a site-ului tău, fără riscul de a strica ceva din greșeală, scrie-ne.

Mastodon