Co rozrasta bazę danych WordPress
Baza danych rośnie niepostrzeżenie. WordPress i wtyczki zapisują w niej znacznie więcej, niż widać gołym okiem. Oto główni sprawcy:
- Rewizje postów (revisions), WordPress domyślnie zapisuje każdą wersję roboczą wpisu. Przy intensywnym pisaniu jeden artykuł może mieć kilkadziesiąt rewizji, które zajmują miejsce w tabeli
wp_posts. - Auto-drafty, automatyczne zapisywanie co kilka minut tworzy szkice, które zostają po opublikowaniu treści.
- Transients, wtyczki i sam WordPress przechowują tymczasowe dane w tabeli
wp_options. Wygasłe transients powinny być usuwane automatycznie, ale często nie są. - Spam i usunięte komentarze, komentarze w koszu i w folderze spam zajmują miejsce w tabeli
wp_commentsdopóki ich nie usuniesz na stałe. - Osierocone metadane, gdy usuniesz post lub produkt WooCommerce, powiązane wpisy w
wp_postmetaczęsto zostają jako sieroty. - Logi wtyczek, wtyczki do formularzy, WooCommerce, narzędzia do backupu czy SEO tworzą własne tabele logów, które potrafią urosnąć do setek megabajtów.
Problem autoload w wp_options, cichy zjadacz wydajności
Tabela wp_options to serce konfiguracji WordPressa. Każdy rekord ma kolumnę autoload. Jeśli ma wartość yes, WordPress ładuje go do pamięci przy każdym żądaniu strony, zanim jeszcze wyświetli choćby jeden element. Gdy sumaryczny rozmiar takich rekordów przekracza 1–2 MB, każde wejście na stronę zaczyna od kosztownego zapytania do bazy.
Aby sprawdzić, ile danych jest autoloadowanych, uruchom w phpMyAdmin lub WP-CLI:
SELECT SUM(LENGTH(option_value)) / 1024 / 1024 AS autoload_mb
FROM wp_options
WHERE autoload = 'yes';
Wynik powyżej 1 MB to sygnał do działania. Żeby zobaczyć, które rekordy są najcięższe:
SELECT option_name, LENGTH(option_value) AS size_bytes, autoload
FROM wp_options
WHERE autoload = 'yes'
ORDER BY size_bytes DESC
LIMIT 20;
Narzędzia do optymalizacji bazy danych WordPress
phpMyAdmin
Dostępny w każdym panelu hostingowym (home.pl, cyber_Folks, LH.pl i innych). Pozwala uruchamiać własne zapytania SQL oraz wykonywać operację OPTIMIZE TABLE przez interfejs graficzny. Dobry do jednorazowych operacji i diagnostyki.
WP-CLI
Narzędzie linii poleceń dla WordPress, szybkie i precyzyjne. Przykłady poleceń:
# Usunięcie wszystkich rewizji
wp post delete $(wp post list --post_type=revision --format=ids) --force
# Usunięcie wygasłych transients
wp transient delete --expired --all
# Optymalizacja wszystkich tabel bazy
wp db optimize
Wtyczki, WP-Optimize i podobne
Jeśli nie masz dostępu do WP-CLI, wtyczki takie jak WP-Optimize czy Advanced Database Cleaner wykonają czyszczenie przez panel admina. Mają też opcję harmonogramu, możesz ustawić automatyczne sprzątanie co tydzień. Przed ich użyciem upewnij się, że wykonałeś backup.
Zapytania SQL do czyszczenia bazy, ostrożnie, zawsze z backupem
Przed wykonaniem poniższych zapytań zrób pełny backup bazy danych. Każde polecenie DELETE jest nieodwracalne.
-- Usunięcie rewizji postów
DELETE FROM wp_posts WHERE post_type = 'revision';
-- Usunięcie auto-draftów
DELETE FROM wp_posts WHERE post_status = 'auto-draft';
-- Usunięcie wygasłych transients
DELETE FROM wp_options
WHERE option_name LIKE '_transient_%'
AND option_name LIKE '%timeout%'
AND option_value < UNIX_TIMESTAMP(NOW());
DELETE FROM wp_options
WHERE option_name LIKE '_transient_%'
AND REPLACE(option_name, '_transient_', '_transient_timeout_')
NOT IN (SELECT option_name FROM wp_options);
-- Usunięcie spamu i odrzuconych komentarzy
DELETE FROM wp_comments WHERE comment_approved = 'spam';
DELETE FROM wp_comments WHERE comment_approved = 'trash';
-- Usunięcie osieroconych metadanych postów
DELETE pm FROM wp_postmeta pm
LEFT JOIN wp_posts p ON pm.post_id = p.ID
WHERE p.ID IS NULL;
Zamiast usuwać transients ręcznie, możesz skorzystać z poradnika o przyspieszaniu WordPress na home.pl, gdzie opisuję m.in. poprawną konfigurację cache'owania, który eliminuje konieczność przechowywania wielu transients.
Optymalizacja tabel, OPTIMIZE TABLE
Po masowym usuwaniu rekordów tabele mają luki w danych, tzw. fragmentację. Operacja OPTIMIZE TABLE defragmentuje tabele i odzyskuje miejsce na dysku. W phpMyAdmin zaznacz wszystkie tabele i kliknij „Optymalizuj tabelę". Przez WP-CLI:
wp db optimize
Na dużych tabelach (powyżej kilkuset MB) operacja może potrwać kilka minut i chwilowo zablokować tabelę, najlepiej uruchamiać ją poza godzinami szczytu.
Profilaktyka, jak ograniczyć rozrost bazy
Najlepsza optymalizacja to taka, której nie trzeba powtarzać co miesiąc. Dwa proste zabiegi znacząco spowalniają rozrost:
- Limit rewizji w pliku
wp-config.php. Dodaj linię:
define( 'WP_POST_REVISIONS', 3 );
Wartość 3 oznacza, że WordPress przechowa maksymalnie 3 ostatnie rewizje każdego wpisu. Możesz też użyć false, żeby wyłączyć rewizje całkowicie, choć odradzam, bo w razie pomyłki nie cofniesz zmian.
- Regularne czyszczenie harmonogramem, WP-Optimize pozwala ustawić automatyczne czyszczenie co tydzień. Zajmuje to minutę konfiguracji i eliminuje ręczną pracę.
- Audyt wtyczek, usuń wtyczki, których nie używasz. Każda zostawia tabele i wpisy w
wp_options, nawet dezaktywowana.
Jeśli zależy Ci na kompleksowym przyspieszeniu strony, nie tylko bazy, ale też cache'u, obrazków i serwera, zajrzyj do mojej usługi optymalizacji WordPress. Baza danych to jeden z kilku elementów, które razem decydują o prędkości.
Dbanie o bazę to też element szerszej troski o stronę. Jeśli wolisz oddelegować to specjaliście, sprawdź moją ofertę monitoringu i obsługi WordPress, w ramach miesięcznej umowy regularnie czyszczę i monitoruję bazy klientów.
Kiedy lepiej zadzwonić do specjalisty
Własnoręczne czyszczenie jest jak najbardziej wykonalne, ale są sytuacje, w których warto powierzyć to komuś doświadczonemu. Jeśli baza ma powyżej kilku gigabajtów, strona działa na produkcji 24/7, nie masz pewności co do backupu, albo po czyszczeniu pojawiają się błędy, zadzwoń do mnie: 577 020 415. Wykonam pełny audyt bazy, zidentyfikuję problematyczne zapytania i przeprowadzę czyszczenie bezpiecznie, z backupem i weryfikacją po wszystkim. Reakcja w ciągu 1 godziny.