sql >> Database >  >> RDS >> Mysql

Waarom zijn verwijzingen naar wp_postmeta zo traag?

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 de PRIMARY 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 van VARCHAR(255) , niet VARCHAR(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

Brondocument

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



  1. Lijst met datumnotatiespecificaties in MySQL

  2. pdo afbeelding direct in database invoegen - altijd BLOB invoegen - 0B

  3. Hoe Log() werkt in PostgreSQL

  4. ReplicationManager gooide een uitzondering bij het openen van een verbinding