sql >> Base de Datos >  >> RDS >> Mysql

¿Por qué las referencias a wp_postmeta son tan lentas?

El esquema estándar para wp_postmeta proporciona índices pobres. Esto conduce a problemas de rendimiento.

Al cambiar el esquema a esto, la mayoría de las referencias a metadatos serán más rápidas:

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

Notas:

  • El AUTO_INCREMENT actual la columna es una pérdida de espacio y ralentiza las consultas porque es la PRIMARY KEY , evitando así el PK "natural" "compuesto" de (post_id, meta_key) .
  • InnoDB aumenta aún más el rendimiento de ese PK debido a la "agrupación". (¡Espero que no sigas usando MyISAM!)
  • Si está utilizando MySQL 5.6 (o MariaDB 10.0 o 10.1), cambie meta_key de VARCHAR(255) , no VARCHAR(191) . (Podemos discutir los motivos y las soluciones alternativas en una pregunta separada, si 191 no es suficiente).
  • INDEX(meta_key) es opcional, pero necesario si desea "encontrar publicaciones que tengan una clave particular".
  • Advertencia:estos cambios acelerarán muchos usos de postmeta, pero no todos. No creo ralentizará cualquier caso de uso. (Proporcione tales consultas si las encuentra. Podría ser un problema de almacenamiento en caché, no una degradación real).

Si desea presentar su CREATE TABLE , puedo proporcionar un ALTER para convertirlo a esto.

Si necesita la capacidad de tener múltiples claves meta con el mismo nombre de clave para una publicación, use esta solución. Es casi tan bueno como la sugerencia anterior.

    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 fuente

Posible ALTERACIÓN

Advertencias:

  • No tengo forma de probar esto.
  • Esto no soluciona el error 767
  • Esto mantiene meta_id porque algún usuario de WP señaló que otras tablas hacen referencia a él.
  • Se supone que puede tener varias filas para un combo (post_id, meta_key). (¿Esto parece un diseño de esquema pobre?)
  • Todo lo que esto hace es acelerar las típicas SELECTs involucrando postmeta.
  • Esto probablemente también se aplica a Woocommerce.
  • Si usa esto, descargue su base de datos y esté listo para recargarla en caso de problemas.

El 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