sql >> Database teknologi >  >> RDS >> Mysql

Hvorfor er referencer til wp_postmeta så langsomme?

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 den PRIMARY 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 fra VARCHAR(255) , ikke VARCHAR(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

Kildedokument

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



  1. Hvordan vælger man et begrænset antal rækker for hver fremmednøgle?

  2. Bruger seneste aktiviteter - PHP MySQL

  3. MySQL til Visual Studio 2012/2013

  4. MySQL FORKLAR:Brug af indeks vs. Brug af indeksbetingelse