Het standaardschema voor wp_postmeta
levert slechte indexen op. Dit leidt tot prestatieproblemen.
Door het schema hierin te veranderen, zullen de meeste verwijzingen naar metadata sneller zijn:
CREATE TABLE wp_postmeta (
post_id …,
meta_key …,
meta_value …,
PRIMARY KEY(post_id, meta_key),
INDEX(meta_key)
) ENGINE=InnoDB;
Opmerkingen:
- De huidige
AUTO_INCREMENT
kolom is een verspilling van ruimte, en vertraagt zoekopdrachten omdat het dePRIMARY KEY
. is , waardoor de "natuurlijke" "samengestelde" PK van(post_id, meta_key)
wordt vermeden . - InnoDB verhoogt de prestaties van die PK verder door "clustering". (Ik hoop dat je MyISAM niet nog steeds gebruikt!)
- Als je MySQL 5.6 (of MariaDB 10.0 of 10.1) gebruikt, verander dan
meta_key
vanVARCHAR(255)
, nietVARCHAR(191)
. (We kunnen de redenen en oplossingen bespreken in een aparte vraag, als 191 niet voldoende is.) INDEX(meta_key)
is optioneel, maar nodig als je "berichten wilt vinden die een bepaalde sleutel hebben".- Voorbehoud:deze wijzigingen zullen vele versnellen gebruik van postmeta, maar niet allemaal. Ik denk niet het zal alle use-cases vertragen. (Geef dergelijke vragen als u ze tegenkomt. Het kan een caching-probleem zijn, geen echte verslechtering.)
Als u uw . wilt presenteren CREATE TABLE
, ik kan een ALTER
om het naar dit om te zetten.
Als je de mogelijkheid nodig hebt om meerdere metasleutels met dezelfde sleutelnaam voor één bericht te hebben, gebruik dan deze oplossing. Het is bijna net zo goed als de bovenstaande suggestie.
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
Mogelijke WIJZIGING
Voorbehoud:
- Ik kan dit niet testen.
- Dit lost de 767-fout niet op
- Dit houdt
meta_id
omdat een WP-gebruiker erop wees dat er door andere tabellen naar wordt verwezen. - Het gaat ervan uit dat je meerdere rijen hebt voor een (post_id, meta_key) combo. (Dit lijkt een slecht schemaontwerp?)
- Dit alles versnelt typische
SELECTs
waarbij postmeta betrokken is. - Dit geldt waarschijnlijk ook voor woocommerce.
- Als je dit gebruikt, dump dan je database en wees klaar om het opnieuw te laden in geval van problemen.
De 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