Mysql
 sql >> база данни >  >> RDS >> Mysql

Защо препратките към wp_postmeta са толкова бавни?

Стандартната схема за 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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql заявка за дата, между две полета за дата

  2. Импортирайте голям MySQL .sql файл в Windows със сила

  3. Писане на подзаявка с помощта на Zend DB

  4. Изпълнение на LIKE заявки в таблици с много милиони редове, MySQL

  5. Съвпадение на Mysql...срещу просто като %term%