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é è laPRIMARY 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
daVARCHAR(255)
, nonVARCHAR(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
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