Mysql
 sql >> Database >  >> RDS >> Mysql

Perché i riferimenti a wp_postmeta sono così lenti?

Lo schema standard per wp_postmeta fornisce indici scadenti. Questo porta a problemi di prestazioni.

Modificando lo schema in questo modo, la maggior parte dei riferimenti ai metadati sarà più veloce:

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

Note:

  • L'attuale AUTO_INCREMENT column è uno spreco di spazio e rallenta le query perché è la PRIMARY KEY , evitando così la PK "naturale" "composita" di (post_id, meta_key) .
  • InnoDB migliora ulteriormente le prestazioni di quel PK grazie al "clustering". (Spero che tu non stia ancora utilizzando MyISAM!)
  • Se stai usando MySQL 5.6 (o MariaDB 10.0 o 10.1), cambia meta_key da VARCHAR(255) , non VARCHAR(191) . (Possiamo discutere le ragioni e le soluzioni alternative in una domanda separata, se 191 non è sufficiente.)
  • INDEX(meta_key) è facoltativo, ma necessario se vuoi "trovare post che hanno una chiave particolare".
  • Avvertimento:queste modifiche accelereranno molte usi del postmeta, ma non solo. Non penso rallenterà qualsiasi caso d'uso. (Per favore fornisci tali domande se le incontri. Potrebbe essere un problema di memorizzazione nella cache, non un vero degrado.)

Se vuoi presentare il tuo CREATE TABLE , posso fornire un ALTER per convertirlo in questo.

Se hai bisogno della possibilità di avere più meta chiavi con lo stesso nome chiave per un post, usa questa soluzione. È buono quasi quanto il suggerimento precedente.

    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

Documento sorgente

Possibile ALTER

Avvertenze:

  • Non ho modo di testarlo.
  • Questo non risolve l'errore 767
  • Questo mantiene meta_id perché alcuni utenti di WP hanno sottolineato che è referenziato da altre tabelle.
  • Presume che potresti avere più righe per una combinazione (post_id, meta_key). (Sembra una progettazione dello schema scadente?)
  • Tutto ciò non fa altro che accelerare i tipici SELECTs che coinvolgono il postmeta.
  • Questo probabilmente vale anche per il woocommerce.
  • Se lo usi, scarica il tuo database e preparati a ricaricarlo in caso di problemi.

L'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