Standardschemat för wp_postmeta
ger dåliga index. Detta leder till prestandaproblem.
Genom att ändra schemat till detta blir de flesta referenser till metadata snabbare:
CREATE TABLE wp_postmeta (
post_id …,
meta_key …,
meta_value …,
PRIMARY KEY(post_id, meta_key),
INDEX(meta_key)
) ENGINE=InnoDB;
Anmärkningar:
- Den nuvarande
AUTO_INCREMENT
kolumnen är ett slöseri med utrymme och saktar ner frågorna eftersom det är denPRIMARY KEY
, och undviker därmed den "naturliga" "sammansatta" PK-koden för(post_id, meta_key)
. - InnoDB ökar prestandan för den PK:n ytterligare på grund av "klustring". (Jag hoppas att du inte fortfarande använder MyISAM!)
- Om du använder MySQL 5.6 (eller MariaDB 10.0 eller 10.1), ändra
meta_key
frånVARCHAR(255)
, inteVARCHAR(191)
. (Vi kan diskutera orsakerna och lösningarna i en separat fråga, om 191 inte är tillräckligt.) INDEX(meta_key)
är valfritt, men behövs om du vill "hitta inlägg som har en speciell nyckel".- Varning:Dessa ändringar kommer att påskynda många användningar av postmeta, men inte alla. Jag tror inte det kommer att sakta ner alla användningsfall. (Ange sådana frågor om du stöter på dem. Det kan vara ett cachningsproblem, inte en verklig försämring.)
Om du vill presentera din CREATE TABLE
, jag kan tillhandahålla en ALTER
för att konvertera det till detta.
Om du behöver möjligheten att ha flera meta-nycklar med samma nyckelnamn för ett inlägg, använd den här lösningen. Det är nästan lika bra som ovanstående förslag.
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
Möjlig ALTER
Varningar:
- Jag har inget sätt att testa detta.
- Detta åtgärdar inte 767-felet
- Detta behåller
meta_id
eftersom någon WP-användare påpekade att den refereras av andra tabeller. - Det förutsätter att du kan ha flera rader för en (post_id, meta_key) combo. (Det här verkar vara dålig schemadesign?)
- Allt detta gör är att påskynda typiska
SELECTs
som involverar postmeta. - Detta gäller förmodligen även woocommerce.
- Om du använder detta, dumpa din databas och var redo att ladda om den vid problem.
SQL:en:
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