Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Dlaczego odwołania do wp_postmeta są tak powolne?

Standardowy schemat dla wp_postmeta zapewnia słabe indeksy. Prowadzi to do problemów z wydajnością.

Zmieniając schemat na ten, większość odniesień do metadanych będzie szybsza:

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

Uwagi:

  • Obecny AUTO_INCREMENT kolumna to strata miejsca i spowalnia zapytania, ponieważ jest to PRIMARY KEY , unikając w ten sposób „naturalnego” „złożonego” PK (post_id, meta_key) .
  • InnoDB dodatkowo zwiększa wydajność tego pliku PK dzięki „klastrowaniu”. (Mam nadzieję, że nadal nie używasz MyISAM!)
  • Jeśli używasz MySQL 5.6 (lub MariaDB 10.0 lub 10.1), zmień meta_key z VARCHAR(255) , a nie VARCHAR(191) . (Możemy omówić przyczyny i obejścia w osobnym pytaniu, jeśli 191 nie jest wystarczające).
  • INDEX(meta_key) jest opcjonalne, ale potrzebne, jeśli chcesz „znaleźć posty, które mają określony klucz”.
  • Uwaga:te zmiany przyspieszą wiele zastosowania postmeta, ale nie wszystkie. Nie myślę spowolni to wszelkie przypadki użycia. (Proszę podać takie zapytania, jeśli je napotkasz. Może to być problem z pamięcią podręczną, a nie rzeczywistą degradacją.)

Jeśli chcesz zaprezentować swoje CREATE TABLE , mogę dostarczyć ALTER przekonwertować go na to.

Jeśli potrzebujesz możliwości posiadania wielu metakluczy o tej samej nazwie klucza dla jednego posta, skorzystaj z tego rozwiązania. Jest prawie tak dobry, jak powyższa sugestia.

    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

Dokument źródłowy

Możliwa zmiana

Ostrzeżenia:

  • Nie mam możliwości przetestowania tego.
  • To nie rozwiązuje błędu 767
  • To zachowuje meta_id ponieważ jakiś użytkownik WP wskazał, że odwołują się do niego inne tabele.
  • Zakłada się, że możesz mieć wiele wierszy dla kombinacji (post_id, meta_key). (Wygląda to na kiepski projekt schematu?)
  • Wszystko to przyspiesza typowe SELECTs z udziałem postmeta.
  • Prawdopodobnie dotyczy to również woocommerce.
  • Jeśli używasz tego, zrzuć swoją bazę danych i bądź gotowy do jej ponownego załadowania w przypadku problemów.

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 LIKE z zasięgiem nie działa

  2. Przykład instrukcji JDBC — wstawianie, aktualizacja, usuwanie wsadowe

  3. Jak zainstalować MySQLdb w Mountain Lion

  4. Najlepsze praktyki w skalowaniu baz danych:część 1

  5. Usuwanie części ciągu w MYSQL