-- Curățarea transient-urilor expirate din wp_options
-- ATENȚIE: Faceți backup înainte de rulare!
DELETE FROM `wp_options`
WHERE `option_name` LIKE '_transient_%'
AND `option_name` NOT LIKE '_transient_timeout_%'
AND SUBSTRING(`option_name`, 12) IN (
SELECT SUBSTRING(`option_name`, 20)
FROM (SELECT * FROM `wp_options`) AS temp
WHERE `option_name` LIKE '_transient_timeout_%'
AND `option_value` < UNIX_TIMESTAMP()
);
DELETE FROM `wp_options`
WHERE `option_name` LIKE '_transient_timeout_%'
AND `option_value` < UNIX_TIMESTAMP();Mulți developeri zic că WooCommerce e lent și că trebuie să treci pe Shopify sau headless la primul semn de trafic. Total fals. WooCommerce devine lent doar dacă îl lași să facă 500 de query-uri SQL pe pagină și dacă ignori complet modul în care WordPress interacționează cu baza de date.
Recent, am avut de optimizat un magazin de fashion destul de măricel. Avea în jur de 15.000 de produse active, variații nenumărate și o bază de date de vreo 4GB umflată de transients și loguri. Timpul de răspuns al serverului (TTFB) pe paginile de categorie era de peste 1.8 secunde. Clientul pierdea clienți zilnic din cauza asta. După câteva zile de muncă, am coborât TTFB-ul la 220ms. Iată exact cum am făcut-o și care sunt compromisurile de care nimeni nu-ți spune.
Redis Object Cache: Salvarea bazei de date, dar cu un preț
Fiecare vizită pe o pagină de produs WooCommerce cere zeci de opțiuni din tabelul wp_options și metadate din wp_postmeta. Fără un cache de obiecte, MySQL este bombardat la fiecare refresh.
Am instalat Redis pe serverul VPS (un VPS destul de ok, cu 4 vCPUs și 8GB RAM) și am configurat pluginul Redis Object Cache de la Till Krüss. Rezultatul? Interogările către baza de date au scăzut cu aproape 70% pe paginile de produs. Datele care nu se schimbă des sunt acum servite direct din memoria RAM.
Trade-off-ul sincer: Redis este un consumator flămând de memorie. Dacă ai un server shared ieftin de 5$ sau un VPS slab configurat, Redis o să-ți mănânce tot RAM-ul și o să primești celebra eroare „Error establishing a database connection” când ți-e lumea mai dragă. Alocă-i o limită maximă de memorie în redis.conf (de exemplu, maxmemory 512mb) și folosește politica volatile-lru ca să nu-ți crape serverul când rămâne fără spațiu.
Cloudflare APO (Automatic Platform Optimization)
Pentru utilizatorii neautentificați, cea mai rapidă pagină este cea care nu mai ajunge deloc la PHP. Aici intervine Cloudflare APO. Costă 5$ pe lună (sau e moca dacă ai planul Pro) și face cache la nivel de edge (CDN) pentru paginile HTML.
Scăderea de TTFB a fost spectaculoasă: de la 800ms (cu Redis activ) direct la 60-80ms global, pentru că paginile erau servite din cel mai apropiat server Cloudflare.
Atenție mare la dinamică: WooCommerce depinde de sesiuni. Trebuie să fii extrem de atent la cookie-urile de sesiune (wp_woocommerce_session_) și la cele de coș (woocommerce_items_in_cart). Cloudflare APO știe nativ să facă bypass la cache când detectează aceste cookie-uri, dar dacă ai un plugin de tip "Wishlist" prost scris care nu folosește AJAX și setează cookie-uri globale, riști ca userii să vadă pagini cache-uite greșit sau, mai rău, coșul altui utilizator. Testați mereu din modul Incognito cu un produs adăugat în coș.
Curățenia în wp_options și tabelele de lookup
Ultimul bottleneck a fost structura de date. WooCommerce folosește tabelele clasice de WordPress, ceea ce înseamnă că filtrele de produse (după mărime, culoare) fac join-uri masive în wp_postmeta.
Primul pas a fost activarea HPOS (High-Performance Order Storage) și a tabelelor de lookup pentru atribute din setările WooCommerce. Al doilea pas a fost curățarea manuală a transient-urilor expirate din baza de date. Am găsit peste 150.000 de rânduri orfane care pur și simplu sufocau indexul pe wp_options.
După rularea scriptului de curățare, dimensiunea tabelului wp_options a scăzut de la 320MB la doar 12MB. Interogările de căutare au devenit aproape instantanee.
Voi ce folosiți pentru a ține în frâu bazele de date mari de WooCommerce? Mergeți pe Redis sau preferați micro-cache direct din Nginx?