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 oPRIMARY 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
zVARCHAR(255)
, nikoliVARCHAR(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
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