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_INCREMENT
kolumna 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_key
zVARCHAR(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_id
ponieważ 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
SELECTs
z 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