Praktická ukázka: Velká tabulka s komentáři

V dnešní praktické ukázce si předvedeme jeden příklad, kdy tabulka s komentáři narostla do obludných rozměrů a přitom počet komentářů v ní vlastně ani nehrál roli. Mimochodem tento podivný případ také ovlivnil rychlost načítání Nástěnky v administraci. Takže pokud vám minulá praktická ukázka nepomohla, tak rozhodně doporučuji projít si jednotlivé tabulky jestli nejsou až moc podezřele velké.

Vše začalo automatickým varováním z webhostingu, že databáze překročila omezenou velikost v rámci zakoupeného tarifu. Dostal jsem za úkol se na to podívat a situaci vyřešit. U Wedos mají celkem trpělivost a pokud nevytěžujete server, tak pár megabajtů tam anebo sem akutně neřeší. Původně jsem si myslel, že se jedná o banalitu, takže jsem to nechal na další den.

Vážený zákazníku,

dovolujeme si Vás upozornit na překročení limitu databází Vašeho webhostingu.

Webhosting: ██████.███
Limit databází: 1000 (MB)
Velikost databází: 1002 (MB)

Prosíme o vyřešení této situace, vaše databáze nesmí překročit daný limit.

WEDOS Internet, a.s.

Zaměřil jsem se na databázi jednoho většího projektu, kde byla asi 700 MB velká tabulka, ale ta se nezvětšovala (pouze se z ní tahají data pokud neexistuje cache). Doprovodné tabulky také nevykazovali žádný růst. Prošel jsem tak další databáze v administraci v rámci jednoho webhostingu a překvapivě jsem na problém narazil u jednoho menšího WordPress webu.

Problém byl malý blog na WordPress

Když uvidíte v statistikách databázi k WordPress jednu, která má přes 200 MB, tak je jasné, že je něco špatně.

Databáze k WordPress, která má přes 200 MB asi nebude v pořádku. Je nutné neprodleně vše zkontrolovat.
Databáze k WordPress, která má přes 200 MB asi nebude v pořádku. Je nutné neprodleně vše zkontrolovat.

 

Samozřejmě pokud používáte nějaké pluginy, které si ukládají velké množství dat, tak je možné takových čísel dosáhnout. Ovšem v tomto případě se jednalo o malý blog, kde bylo jen pár článků a pár komentářů.

Prošel jsem jednotlivé tabulky a zjistil, že problém je v té, která uchovává komentáře (wp_comments).

Komentáře, které zabírají 174 MB? Tady bude očividně něco špatně.
Komentáře, které zabírají 175 MB? Tady bude očividně něco špatně.

 

6465 komentáře, které zabírají celkem 175,4 MB. Přes 27 KB na komentář, tedy přes 27 tisíc znaků na jeden. Což teoreticky možné je protože maximální délka, kterou lze uložit do tabulky (do comment_content) může být až 65525 znaků.

Koukl jsem do administrace a na celém blogu jen 2 schválené komentáře, několik ve složce spam a zbytek v koši (trash), kam je ukládal plugin FV Antispam. Ten je nastavený, že je má smazat při počtu 20 tisíc. To je hezké, ale pokud budou spameři vkládat takto dlouhé komentáře, tak to odnese brzy databáze.

Hromadné smazání komentářů ve složce koš

Vrátím se zpět do PHPmyAdmin a začnu s mazáním komentářů. Jeden SQL dotaz a koš je prázdný.

s
Pomocí jednoduchého SQL dotazu všechny komentáře v koši byly smazány.

SQL dotaz pro smazání obsahu koše:

DELETE FROM wp_comments WHERE comment_approved = "trash";

SQL dotaz pro smazání komentářů označených jako spam

DELETE FROM wp_comments WHERE comment_approved = "spam";

Pozor je nutné upravit wp_comments podle toho jak se tabulka jmenuje. Při instalaci si volíte vždy předponu pro tabulky kvůli zvýšení bezpečnosti.

Jenomže to nestačilo

Moc jsem nepřemýšlel nad tím, jestli se opravdu v tabulce nachází velké komentáře. Takže mě pak trochu překvapilo, když zůstali v tabulce jen dva řádky (komentáře) a celá přitom stále měla přes 170 MB. Říkám si aha, tak tady byl problém úplně někde jinde.

Tohle dělala tabulka MyISAM po velkých čistkách a bylo nutné jí optimalizovat. U tabulek InnoDB jsem se s tím však setkal poprvé.

Zadal jsem tedy SQL:

OPTIMIZE TABLE wp_comments;

Což vedlo k informaci, že to InnoDB neumí a místo toho se provedl recreate + analyze. To si budu muset projít ještě v dokumentaci.

V každém případě to problém vyřešilo. Tabulka má pár desítek kilobajtů včetně klíčů. Také se celkem výrazně zvýšila rychlost nástěnky u administrace, kde se právě získávají data z tabulky wp_comments.

Co se stalo

Tohle mi celkem vrtá hlavou. Pár WodPress webů už jsem dával dohromady ale na takovýto problém s InnoDB jsem prozatím nenarazil.

Autor Ginoza

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

Napsat komentář

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