Pomalá databáze WordPress – problém s transient

Problém s databází u WordPress většinou naznačuje dlouhé načítání stránek, konkrétně TTFB (time to first byte). To je doba, za kterou prohlížeči pošle server odpověď o žádost stránky. Může se jednat o dlouhé vteřiny, ale také místo stránky se dočkáte jen chyby 503, prostě vyčerpání prostředků. Pozor dlouhé načítání mohou způsobit také externí zdroje z kterých se snaží plugin stáhnout data (například externí RSS feed). WordPress na takovýto zdroj musí počkat, než odešle stránku prohlížeči. Záleží tedy na rychlosti protistrany.

Dneska se však budeme věnovat čistě databázi. Jestliže nestíhá, je dobré podívat se na jednotlivé tabulky a zjistit, co je špatně. Nejčastěji je problémem velké množství dat v tabulkách. Nejjednodušší je využít rozhraní phpMyAdmin, které značně ulehčí práci s databází. Dávejte si však pozor. V databázi jsou uložena všechna data. Doslova na dva kliky můžete přijít o kompletní obsah.

Databázi většinou nevytěžuje objem, ale počet záznamů (záleží samozřejmě na SQL dotazu). Zaměříme se na tabulku wp_options. Jedná se o nejvytíženější tabulku ve WordPress. WordPress z ní neustále čte, zapisuje a přepisuje data. Počet záznamů v ní, tak má přímý vliv na výkon WordPress. Je těžké říct, kolik je běžná velikost této tabulky, protože jí využívají pluginy rozdílně. Průměrný WordPress by měl mít do 1000 řádek s velikostí maximálně stovek kilobajtů. Ovšem například plugin WooCommerce tuto tabulku dokáže využívat i mnohokrát více. Pokud však počet záznamů naroste do desítek tisíc, popřípadě desítek megabajtů už se jedná o problém, který je třeba řešit na programátorské úrovni.

Pokud máte problém právě s tabulkou wp_options mohou za tím být záznamy, které obsahují v option_name hodnotu _transient_. Někdy jejich počet může dosáhnout tisíce či dokonce desítek tisíc.

K čemu slouží Transient ve WordPress

WordPress si většinou do transient ukládá data, která se náročně získávají a tato data mají nějakou trvanlivost. Aby je nemusel opakovaně získávat při každém spuštění skriptu prostě si je uloží na určitou dobu. Jedná se o určitou formu dočasné paměti (cache). Transient se skládají z klíče (název), hodnoty (co obsahují) a délky života (ve vteřinách).

Příklad. Plugin zobrazuje na stránce seznam článků z jiného blogu, jejíchž titulky si stáhne přes RSS. Za normálních okolností, by se plugin musel pokaždé připojit k jinému blogu, stáhnout RSS, parsovat data a zobrazit je. To by trvalo třeba jednu dvě vteřiny, v případě, že by jiný blog měl nějaký problém tak i do timeout. Místo toho, vše udělá plugin jen jednou a seznam titulků si uloži do transient s trvanlivostí 3600 vteřin (hodina). Během této hodiny, tak jen sahá do wp_option a zobrazuje obsah hodnoty v transient. Po hodině dojde k znovuvygenrování transcient.

Příliš mnoho transcient zpomaluje WordPress

Pluginy by po sobě měly vždy vyčistit nepořádek. Někdy to však nemusí udělat, jindy zase může vzniknout nechtěně velké množství transcient záznamů (klidně i stovky tisíc). Právě tohle povede k velkému zpomalení WordPress.

pretizena-databaze-wordpress-pred-cistenim
Tabulka je přeplněná záznamy transient. Většina z nich není potřebná. Jedná se o pozůstatky pluginů.

 

Transcient záznamy můžete vyčistit jednoduchým SQL příkazem:

DELETE FROM `wp_options` WHERE `option_name` LIKE ('%\_transient\_%')

* wp_options se jmenuje předkonfigurovaná tabulka, ta vaše může být něcojiného_options.

pretizena-databaze-wordpress-cisteni-transient
Z 10228 připadalo na transient 10091 záznamů. Jejich promázání zabralo serveru přes tři vteřiny. Práce s touto tabulkou WordPress velice brzdila, zvláště pokud stránka neměla cache.

 

Po provedení operace je třeba tabulku optimalizovat.

pretizena-databaze-wordpress-po-cistenim
7,5 MB dat, které jsou navíc odstraníme optimalizací tabulky.

 

Provedete to následujícím SQL dotazem.

OPTIMIZE TABLE `wp_options`
pretizena-databaze-wordpress-po-cistenim-a-optimalizaci
Počet záznamů byl zredukován z 10228 na 137 a z 7,9 MB na 50,1 KB.

 

Zatímco u cachovaného obsahu není rychlení nijak znatelné, tak u necachovaného, jako je třeba administrace, je velice znát. Stránka se nenahrává 1 – 3 vteřiny ale jen zlomek vteřiny.

Pokud si na něj netroufáte anebo nemáte přístup k databázi, zkuste plugin Transients Manager. Pozor v případě opravdu velkého problému, nemusí stačit a bez ručního promazání po určitém počtu se neobejdete (na konec SQL se přidá LIMIT 1000).

Autor Ginoza

Pracuji na zákaznické podpoře jednoho známého webhostingu.

Připojte se k diskuzi

2 komentáře

  1. Chci se zeptat zda doporučuješ např. udělat i OPTIMIZE TABLE `wp_postmeta`? Zde mam těch řádků o poznání víc. Tak zda si to WP optimalizuje sám nebo mám raději udělat takto ručně?

    1. Provádím to vždy, když dělám nějaký větší zásah do tabulky, kde se mění velikost (smazání dat, úprava velkého množství dat). Jinak ne. WP si zřejmě tabulky nijak neoptimaliozuje.

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *