Standardowy schemat dla wp_postmeta zapewnia słabe indeksy. Prowadzi to do problemów z wydajnością.
Zmieniając schemat na ten, większość odniesień do metadanych będzie szybsza:
CREATE TABLE wp_postmeta (
post_id …,
meta_key …,
meta_value …,
PRIMARY KEY(post_id, meta_key),
INDEX(meta_key)
) ENGINE=InnoDB;
Uwagi:
- Obecny
AUTO_INCREMENTkolumna to strata miejsca i spowalnia zapytania, ponieważ jest toPRIMARY KEY, unikając w ten sposób „naturalnego” „złożonego” PK(post_id, meta_key). - InnoDB dodatkowo zwiększa wydajność tego pliku PK dzięki „klastrowaniu”. (Mam nadzieję, że nadal nie używasz MyISAM!)
- Jeśli używasz MySQL 5.6 (lub MariaDB 10.0 lub 10.1), zmień
meta_keyzVARCHAR(255), a nieVARCHAR(191). (Możemy omówić przyczyny i obejścia w osobnym pytaniu, jeśli 191 nie jest wystarczające). INDEX(meta_key)jest opcjonalne, ale potrzebne, jeśli chcesz „znaleźć posty, które mają określony klucz”.- Uwaga:te zmiany przyspieszą wiele zastosowania postmeta, ale nie wszystkie. Nie myślę spowolni to wszelkie przypadki użycia. (Proszę podać takie zapytania, jeśli je napotkasz. Może to być problem z pamięcią podręczną, a nie rzeczywistą degradacją.)
Jeśli chcesz zaprezentować swoje CREATE TABLE , mogę dostarczyć ALTER przekonwertować go na to.
Jeśli potrzebujesz możliwości posiadania wielu metakluczy o tej samej nazwie klucza dla jednego posta, skorzystaj z tego rozwiązania. Jest prawie tak dobry, jak powyższa sugestia.
meta_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, -- keep after all
...
PRIMARY KEY(post_id, meta_key, meta_id), -- to allow dup meta_key for a post
Możliwa zmiana
Ostrzeżenia:
- Nie mam możliwości przetestowania tego.
- To nie rozwiązuje błędu 767
- To zachowuje
meta_idponieważ jakiś użytkownik WP wskazał, że odwołują się do niego inne tabele. - Zakłada się, że możesz mieć wiele wierszy dla kombinacji (post_id, meta_key). (Wygląda to na kiepski projekt schematu?)
- Wszystko to przyspiesza typowe
SELECTsz udziałem postmeta. - Prawdopodobnie dotyczy to również woocommerce.
- Jeśli używasz tego, zrzuć swoją bazę danych i bądź gotowy do jej ponownego załadowania w przypadku problemów.
SQL:
ALTER TABLE wp_postmeta
DROP PRIMARY KEY,
DROP INDEX post_id,
ADD PRIMARY KEY(post_id, meta_key, meta_id), -- to allow dup meta_key for a post
ADD INDEX(meta_id); -- to keep AUTO_INCREMENT happy