Trochę za późno, aby odpowiedzieć na to pytanie, ale od czasu odpowiedniego wyszukiwania, przyda się to komuś:
WordPress używa schematu bazy danych EAV do części swojej implementacji bazy danych. Dotyczy to zarówno danych, jak i użytkowników. (Są przechowywane w osobnych tabelach)
Aby wyjaśnić to z punktu widzenia danych:
Wraz z bezpośrednio dostępnymi szczegółami związanymi z postami w wp_posts, liczne meta są wysyłane do tabeli wp_postmeta dla każdego postu. Wszelkie dane dotyczące posta (lub niestandardowego typu posta).
Problem polega na tym, że jeśli masz HEAPS postów lub stron (lub niestandardowych postów / danych), wyszukiwanie dowolnej właściwości znalezionej w meta jest dość wolne. Najpierw przeszukujesz wszystkie wpisy w meta tabeli pod kątem potrzebnych kryteriów, a następnie dostajesz odpowiedni post z tabeli. Kickerem jest to, że musisz szukać KAŻDEGO kryterium osobno. Więc poszukaj tagu, otrzymujesz posty o wartości X dla „meta1”, a następnie wyszukujesz drugie kryteria, powiedzmy, customcriteria i otrzymujesz identyfikatory postów z customcriteriavalue1 w customcriteria, ORAZ następnie przechodzisz przez ich skrzyżowanie, a następnie idziesz, aby uzyskać szczegóły posta z tabeli postów z tym skrzyżowaniem.
Jako przykład - włóż 30 000 produktów do WooCommerce, a skończysz z ~ 1 800 000 wierszy w wp_postmeta, jak wyjaśniono w poniższej odpowiedzi:
Publikuj meta vs. oddzielne tabele bazy danych
Tak więc, nie tylko spowoduje to, że wyszukiwanie będzie bardzo nieefektywne (szczególnie gdy wykonujesz samodzielne połączenia na wp_postmeta dla wielu kryteriów), ale nawet zapytanie jednego wiersza spośród 1,8 mil wierszy powoduje pogorszenie wydajności.
Niedobór schematu EAV.
Tak więc przy wielu postach implementacja db WordPress sprawia, że złożone wyszukiwanie jest bardzo wolne.
Prowadzenie witryny WordPress z tysiącami postów jest całkiem wykonalne, jeśli używasz wtyczek buforujących. Możesz iść jeszcze więcej. Ale wyszukiwania będą problemem.
............
To samo dotyczy również użytkowników - wp_usermeta używa również tego samego formatu EAV. Więc jeśli masz wielu użytkowników i masz wiele wtyczek, które przechowują różne dane użytkownika w wp_usermeta, podejmiesz ten sam wzrost wydajności.
Nie wspominając już o tak dużej liczbie użytkowników, jest prawdopodobne, że będziesz już mieć dużą liczbę postów - chyba że twoja aplikacja ma coś wspólnego z użytkownikami (CRM itp.) I zdecydujesz się przechowywać dane użytkownika w wp_usermeta zamiast wp_postmeta . (Mało prawdopodobne).
.........
Istnieje kilka wtyczek, które próbują obejść ten problem, na przykład Meta Accelerator.
https://wordpress.org/plugins/meta-accelerator/
Ta wtyczka pobiera dane dla dowolnego wybranego typu posta i umieszcza je w płaskich tabelach. Przyspiesza to wyszukiwanie, a także przyspiesza wyszukiwanie zapytań o dowolną pojedynczą wartość.
Ale ta wtyczka jest jeszcze w powijakach.
Alternatywnie możesz zainstalować ElasticSearch na serwerze i użyć wtyczki ElasticPress lub innej wtyczki, która integruje ją z WordPress, aby przyspieszyć takie wyszukiwania.
PHP
część stosu nie będzie twoim problemem (Facebook jest zbudowany na zmodyfikowanym PHP), aleMySQL
bardzo dobrze może być ograniczający.Przekonałem się, jak wielu użytkowników Wordpress może mieć limit czasu PHP, który pojawia się w grze na stronie administratora użytkowników.
Zakładając, że wszyscy użytkownicy mają co najmniej 1 rolę, mają
wp_capabilities
wpis wuser_metadata
tabeli z szeregowym szeregiem ról.Strona administratora pokazuje liczbę użytkowników z każdym typem roli, więc musi załadować każdą pojedynczą tablicę serializowaną wp_capabilities, odserializować to, a następnie pokazać całkowitą liczbę.
Gdy mam 300 000 użytkowników, strona administracyjna użytkowników zajmuje 44 sekundy.
Oznacza to, że każdy użytkownik dodaje 0,00014666666 sekund do czasu ładowania strony.
Zakładając, że Twój limit czasu PHP wynosi 60 sekund, co ograniczyłoby około 400 000 użytkowników.
Jednak korzystam z dość starego i wolnego serwera. Szybszy sprzęt znacznie poprawiłby sytuację.
źródło