sql >> Databasteknik >  >> RDS >> Mysql

Varför är referenser till wp_postmeta så långsamma?

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 den PRIMARY 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ån VARCHAR(255) , inte VARCHAR(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

Källdokument

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



  1. MySQL length() vs char_length()

  2. Hur använder jag PostgreSQL JSON(B)-operatorer som innehåller ett frågetecken? via JDBC

  3. Hur man begränsar SHOW TABLES-frågan

  4. PHP Bästa sättet att cachelagra MySQL-resultat?