Na początku każdej strony obsługiwanej przez WordPress znajduje się wywołanie MySQL w celu pobrania opcji:
SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes';
Ponieważ w autoload
kolumnie nie ma indeksu , MySQL musi wyszukiwać WSZYSTKIE wiersze.
Natknąłem się również na komentarz tej odpowiedzi, mówiąc, że nie byłoby żadnego wzrostu wydajności, nawet gdyby istniał indeks.
W mojej aplikacji użyłem wielu wartości przejściowych, aby służyć jako zamiennik sesji. Działały świetnie, a ja mam własne procedury usuwania śmieci. Zauważyłem, że w wp_options
tabeli wszystkie moje wartości przejściowe (te zaczynające się od _transient_
) mają autoload=no
. Oczekuję, że liczba wierszy mojej wp_options
tabeli będzie rosła wraz ze wzrostem liczby użytkowników jednocześnie.
Chciałbym wiedzieć, dlaczego stół został zaprojektowany w ten sposób. I czy powinienem utworzyć indeks dla mojego konkretnego przypadku?
źródło
autoload
kolumnie.wp_options.autoload
. Źródła: make.wordpress.org/core/2019/10/15/… ... i ... core.trac.wordpress.org/ticket/24044#comment:87 ... Uznanie dla @DanBUK, który zaproponował tę funkcję w 2013 r.Prowadzę 3 blogi WP na dużej instancji Debian Squeeze i badałem, dlaczego mysql utknął na tym hoście przy zużyciu procesora 200% i obciążeniu systemu między 3 a 6. Patrząc na „pokaż listę procesów” w mysql, zrozumieliśmy, że W tym problemie uczestniczyła tabela wp_option, dlatego wykonaliśmy:
Po tej operacji obciążenie mysql pokazane na górze drastycznie spadło do 1%, a średnia wartość obciążenia instancji wynosi teraz 0,10.
Korzystamy z niektórych wtyczek, aby gdzieś w kodzie mogła być pętla, i może to być szczególna sytuacja, ale w naszym przypadku zmiana wydajności jest całkowicie zadziwiająca.
Nasza tabela wp_options ma 347 wierszy.
źródło
select *
raz na zawsze. Zamiast tego sprawdza zapytania dla każdej opcji, dlatego umieszczenie indeksu zrobi dużą różnicę.Podczas gdy @fuxia zaakceptowała poprawki dotyczące niektórych „zgłoszonych” powodów (z których większość została zgłoszona przez pracowników Automattic na różnych biletach Trac itp.), Podstawowym powodem, dla którego WordPress Core nie zawiera indeksu opcji automatycznego ładowania w
wp_options
tabeli jest to, że Automattic martwił się, że negatywnie wpłynie to na wydajność baz danych MySQL, które nadal używały silnika MyISAM.W szczególności wskazali na samą witrynę WordPress.org, która jest bardzo starą / złożoną bazą danych, jako przykładową stronę internetową, której wydajność byłaby ograniczona przez taki indeks.
Niemal wszystkie inne powody, dla których nie dodano indeksu za ostatnie 9 lat (tak, od 2010 r. W przypadku biletu Trac # 14258 i od 2013 r. W przypadku biletu Trac # 24044 ) były wielokrotnie niepoprawne przez dziesiątki członków Społeczność WordPress, ale zaangażowani pracownicy Automattic wielokrotnie ignorowali kilka niezależnych testów porównawczych i wrócili do wzmianki o obawach związanych z MyISAM.
Na szczęście pod koniec 2019 r. Z PHP 7.2 jest teraz „domyślna” wersja zalecana przez WordPress Core, a z silnikiem InnoDB teraz domyślnie w wersjach MySQL po wersji 5.5 oraz przy ciągłej presji ze strony różnych programistów, w tym @DanBUK, którzy utrzymywali ten problem przez lata , Automattic w końcu poddał się i postanowił dodać indeks automatycznego ładowania z WordPress 5.3+ w listopadzie 2019 r.
My w LittleBizzy uruchomiliśmy pierwszą znaną wtyczkę, która automatycznie dodała indeks, jeśli nie istniał, który jest nadal dostępny na GitHub i jest regularnie pobierany. Pamiętaj, że nie musisz już instalować takich wtyczek do stosu WordPress, jeśli korzystasz z WP Core 5.3 + ...
źródło