Стандартната схема за wp_postmeta
осигурява лоши индекси. Това води до проблеми с производителността.
Като промените схемата на това, повечето препратки към мета данни ще бъдат по-бързи:
CREATE TABLE wp_postmeta (
post_id …,
meta_key …,
meta_value …,
PRIMARY KEY(post_id, meta_key),
INDEX(meta_key)
) ENGINE=InnoDB;
Бележки:
- Текущият
AUTO_INCREMENT
колоната е загуба на място и забавя заявките, защото еPRIMARY KEY
, като по този начин избягва "естествения" "композитен" PK на(post_id, meta_key)
. - InnoDB допълнително повишава производителността на този PK поради „клъстериране“. (Надявам се, че все още не използвате MyISAM!)
- Ако използвате MySQL 5.6 (Или MariaDB 10.0 или 10.1), променете
meta_key
отVARCHAR(255)
, а неVARCHAR(191)
. (Можем да обсъдим причините и заобиколните решения в отделен въпрос, ако 191 не е достатъчно.) INDEX(meta_key)
е по избор, но е необходимо, ако искате да „намерите публикации, които имат определен ключ“.- Предупреждение:Тези промени ще ускорят много използване на postmeta, но не всички. Не мисля това ще забави всички случаи на употреба. (Моля, предоставете такива заявки, ако срещнете такива. Може да е проблем с кеширането, а не реално влошаване.)
Ако желаете да представите вашата CREATE TABLE
, мога да предоставя ALTER
за да го преобразувате в това.
Ако имате нужда от възможността да имате множество мета ключове с едно и също име на ключ за една публикация, тогава използвайте това решение. Това е почти толкова добро, колкото горното предложение.
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
Възможна ALTER
Предупреждения:
- Нямам начин да тествам това.
- Това не отстранява грешката 767
- Това запазва
meta_id
защото някой потребител на WP посочи, че е препратен от други таблици. - Предполага се, че може да имате няколко реда за комбинация (post_id, meta_key). (Това изглежда като лош дизайн на схема?)
- Всичко, което прави, е да ускорява типичните
SELECTs
включващ postmeta. - Това вероятно важи и за woocommerce.
- Ако използвате това, моля, изхвърлете базата си данни и бъдете готови да я презаредите в случай на проблем.
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