Jeśli twoja wtyczka będzie miała DUŻO danych, wp_postmeta
to NIE jest dobrym pomysłem, jak pokazano poniżej:
Biorąc za przykład WooCommerce, w sklepie z ~ 30 000 produktów będzie średnio, powiedzmy, ~ 40 post meta (atrybuty i wszystko) na produkt, 5 zdjęć produktu na produkt, co oznacza, że będzie ~ 4 meta obrazu dla każdego obrazu:
30 000 produktów x 40 meta każdy = 1 200 000 wierszy wp_postmeta
+
30 000 produktów x 5 zdjęć każdy x 4 meta obrazu dla każdego = 600 000 wierszy wp_postmeta
Tak więc, mając zaledwie 30 000 produktów, oczekujesz 1 800 000 wierszy wp_postmeta
.
Jeśli dodasz więcej właściwości do swoich produktów lub zdjęć produktów, liczba ta się pomnoży.
Problem z tym jest dwojaki:
- Samodzielne dołączanie jest bardzo kosztowne w MySQL
wp_postmeta
tabela nie jest indeksowana, chyba że używasz późniejszych wersji mysql (tj. nie ma indeksu FULLTEXT dla meta_value
)
Aby podać przykład z rzeczywistej sprawy:
SELECT meta_value FROM wp_postmeta WHERE meta_key LIKE '_shipping_city'
To wybiera miasto wysyłki ze wszystkich szczegółów zamówienia w ok. 3 sekundach na dedykowanym serwerze podstawowym, nawet jeśli jest 5–10 zamówień . Jest tak, ponieważ zapytanie jest uruchamiane z wp_postmeta
tabeli, która ma ~ 3 miliony wierszy w instalacji na żywo.
Nawet strona główna działa dość wolno, ponieważ motyw pobiera różne elementy wp_postmeta
- suwaki, kilka wstawek recenzji, kilka innych meta. Ogólnie lista produktów jest bardzo powolna, wyszukiwania są podobnie powolne podczas umieszczania produktów na liście.
Nie można tego naprawić w żaden normalny sposób. Możesz umieścić Elastic Search na swoim serwerze i użyć wtyczki Elastic Search w Wordpress, możesz użyć redis / memcached, możesz użyć dobrej wtyczki pamięci podręcznej strony, ale w końcu pozostanie fundamentalny problem - pobieranie dowolnej ilości danych z rozdętego wp_postmeta
tabela będzie powolna, ilekroć to zrobisz. Na serwerze, na którym testowałem rozwiązanie, które wdrożyłem poniżej, wszystkie zostały zainstalowane i skonfigurowane poprawnie i zoptymalizowane, a strona działała poprawnie OK dla niezalogowanych użytkowników lub często wykonywanych zapytań od momentu uruchomienia wtyczek buforujących.
Ale w momencie, gdy zalogowany użytkownik próbował zrobić coś, co zwykle nie było wykonywane, albo crony, wtyczki buforujące lub inne narzędzie chciało pobrać rzeczywiste dane z bazy danych, aby je buforować lub zrobić cokolwiek innego, wszystko poszło powoli.
Więc spróbowałem czegoś innego:
Kodowałem małą wtyczkę, aby przenieść wszystkie meta produktu (postmeta dla produktu typu post ) do niestandardowej tabeli generowanej przez kod. Ta wtyczka wzięła wszystkie meta dla każdego postu i utworzyła tabelę, dodając każdą meta jako kolumny i wstawiając wartości do każdego wiersza. Przekształciłem format EAV w poziomy, płaski format relacyjny. Miałem też wtyczkę do usuwania postmeta ze wszystkich przeniesionych produktów ze wp_postmeta
stołu.
W tym momencie przeniosłem załącznik postmeta i meta wszystkich innych typów postów do własnych tabel.
Następnie podłączyłem się do get_(post_type)_meta
filtra, aby zastąpić pobieranie metadanych i udostępniać je z nowych tabel niestandardowych.
Teraz to samo zapytanie z wcześniejszego okresu, którego pobranie zajęło ~ 3 sekundy, wp_postmeta
zajmuje ~ 0,006 sekundy. Strona zachowuje się tak, jakby była świeżą instalacją WP.
....................
Oczywiście, robienie rzeczy tak, jak Wordpress jest lepsze. To jest właściwie norma.
Jednak jest również oczywista wiedza, że tabela EAV jest bardzo nieefektywna w skalowaniu. Jest nieskończenie elastyczny i pozwala przechowywać dowolne dane, ale cena za to jest wydajnością. To podstawowa kompromis.
W tym kontekście trudno jest powiedzieć komuś, kto zamierza zgromadzić masę danych, i - na wszelki wypadek - zapytać / wyszukać te dane, aby wp_postmeta
na pewno użyć tabeli. Hit wydajności będzie świetny.
Korzystanie z niestandardowych tabel pozwoli na gromadzenie danych i nadal będzie wystarczająco szybkie.
Podobnie jak Pippin Williams, twórca wtyczki Easy Digital Downloads, użyłby tabel niestandardowych, gdyby zaczął kodować swoją wtyczkę, jeśli zamierzasz stworzyć coś, co będzie używane przez długi czas lub gromadzić dużo danych, bardziej efektywne jest używanie własnych tabel, jeśli dobrze je zaprojektujesz.
Musisz upewnić się, że każdy inny programista wtyczek / dodatków ma sposób na podłączenie się do wtyczki w celu manipulowania danymi przed i po ich odzyskaniu. Jeśli to zrobisz, będziesz całkiem solidny.