Standardskemaet for wp_postmeta
giver dårlige indekser. Dette fører til ydeevneproblemer.
Ved at ændre skemaet til dette, vil de fleste referencer til metadata være hurtigere:
CREATE TABLE wp_postmeta (
post_id …,
meta_key …,
meta_value …,
PRIMARY KEY(post_id, meta_key),
INDEX(meta_key)
) ENGINE=InnoDB;
Bemærkninger:
- Den nuværende
AUTO_INCREMENT
kolonne er spild af plads og gør forespørgsler langsommere, fordi det er denPRIMARY KEY
, og derved undgår den "naturlige" "sammensatte" PK af(post_id, meta_key)
. - InnoDB øger ydeevnen af denne PK yderligere på grund af "klyngning". (Jeg håber ikke du stadig bruger MyISAM!)
- Hvis du bruger MySQL 5.6 (eller MariaDB 10.0 eller 10.1), skal du ændre
meta_key
fraVARCHAR(255)
, ikkeVARCHAR(191)
. (Vi kan diskutere årsagerne og løsningerne i et separat spørgsmål, hvis 191 ikke er tilstrækkeligt). INDEX(meta_key)
er valgfri, men nødvendig, hvis du vil "finde indlæg, der har en bestemt nøgle".- Advarsel:Disse ændringer vil fremskynde mange brug af postmeta, men ikke alle. Jeg tror ikke det vil bremse enhver brugssituation. (Send venligst sådanne forespørgsler, hvis du støder på dem. Det kan være et cacheproblem, ikke en reel forringelse.)
Hvis du gerne vil præsentere din CREATE TABLE
, jeg kan give en ALTER
for at konvertere det til dette.
Hvis du har brug for muligheden for at have flere meta-nøgler med det samme nøglenavn til et indlæg, så brug denne løsning. Det er næsten lige så godt som ovenstående forslag.
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
Mulig ÆNDRING
Forbehold:
- Jeg har ingen måde at teste dette på.
- Dette løser ikke 767-fejlen
- Dette beholder
meta_id
fordi en WP-bruger påpegede, at den er refereret af andre tabeller. - Det antager, at du muligvis har flere rækker for en (post_id, meta_key) combo. (Dette virker som et dårligt skemadesign?)
- Alt dette gør er at fremskynde typiske
SELECTs
involverer postmeta. - Dette gælder sandsynligvis også for woocommerce.
- Hvis du bruger dette, skal du dumpe din database og være klar til at genindlæse den i tilfælde af problemer.
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