sql >> Databáze >  >> RDS >> Mysql

Proč jsou odkazy na wp_postmeta tak pomalé?

Standardní schéma pro wp_postmeta poskytuje špatné indexy. To vede k problémům s výkonem.

Změnou schématu na toto bude většina odkazů na metadata rychlejší:

CREATE TABLE wp_postmeta (
    post_id …,
    meta_key …,
    meta_value …,
    PRIMARY KEY(post_id, meta_key),
    INDEX(meta_key)
) ENGINE=InnoDB;

Poznámky:

  • Aktuální AUTO_INCREMENT sloupec je plýtvání místem a zpomaluje dotazy, protože jde o PRIMARY KEY , čímž se vyhýbá "přirozenému" "složenému" PK (post_id, meta_key) .
  • InnoDB dále zvyšuje výkon tohoto PK díky „shlukování“. (Doufám, že ještě nepoužíváte MyISAM!)
  • Pokud používáte MySQL 5.6 (nebo MariaDB 10.0 nebo 10.1), změňte meta_key z VARCHAR(255) , nikoli VARCHAR(191) . (Pokud číslo 191 nestačí, můžeme důvody a náhradní řešení prodiskutovat v samostatné otázce.)
  • INDEX(meta_key) je volitelná, ale je potřeba, pokud chcete "najít příspěvky, které mají konkrétní klíč".
  • Upozornění:Tyto změny urychlí mnohé použití postmeta, ale ne všechny. Nemyslím zpomalí to jakékoli případy použití. (Pokud se s nimi setkáte, uveďte takové dotazy. Může se jednat o problém s mezipamětí, nikoli o skutečnou degradaci.)

Pokud byste chtěli prezentovat své CREATE TABLE , mohu poskytnout ALTER jej převést na toto.

Pokud potřebujete možnost mít více meta klíčů se stejným názvem klíče pro jeden příspěvek, použijte toto řešení. Je téměř tak dobrý jako výše uvedený návrh.

    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

Zdrojový dokument

Možná ALTER

Upozornění:

  • Nemám způsob, jak to vyzkoušet.
  • To neřeší chybu 767
  • Tím zůstane meta_id protože nějaký uživatel WP poukázal na to, že na něj odkazují jiné tabulky.
  • Předpokládá, že můžete mít více řádků pro kombinaci (post_id, meta_key). (Vypadá to jako špatný návrh schématu?)
  • Vše, co to dělá, je urychlit typické SELECTs zahrnující postmeta.
  • Pravděpodobně to platí i pro woocommerce.
  • Pokud toto používáte, vypište prosím databázi a buďte připraveni ji znovu načíst v případě problémů.

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. Jak vložím klauzuli „if“ do řetězce SQL?

  2. Jak zesměšňujete MySQL (bez ORM) v Node.js?

  3. MySQL odstraní více řádků v rámci jedné podmínky dotazu jedinečné pro každý řádek

  4. Jak odstranit špatné znaky, které nejsou vhodné pro kódování utf8 v MySQL?