Optimización de la consulta SQL de WordPress personalizada para obtener metadatos de usuario

3 minutos de lectura

avatar de usuario
Zhakal

Tengo la siguiente consulta y funciona. Pero lleva mucho tiempo procesarlo debido a su acumulación. Por lo tanto, necesito ayuda para obtener esta consulta más rápido.

Consulta SQL

En la consulta, PRODUCT_ID debe reemplazarse por ‘ ‘ y el número de ID de producto.

SELECT
    b.order_id,
    customer_meta.meta_value AS customer_id,
    users.user_email,
    qty_table.meta_value AS qty,
    user_meta1.meta_value AS firstname,
    user_meta2.meta_value AS lastname,
    user_meta3.meta_value AS company,
    user_meta4.meta_value AS address,
    user_meta5.meta_value AS city,
    user_meta6.meta_value AS postcode,
    user_meta7.meta_value AS state,
    user_meta8.meta_value AS user_phone
FROM
    wp_woocommerce_order_itemmeta a,
    wp_woocommerce_order_items b,
    wp_postmeta customer_meta,
    wp_users users,
    wp_woocommerce_order_itemmeta qty_table,
    wp_usermeta user_meta1,
    wp_usermeta user_meta2,
    wp_usermeta user_meta3,
    wp_usermeta user_meta4,
    wp_usermeta user_meta5,
    wp_usermeta user_meta6,
    wp_usermeta user_meta7,
    wp_usermeta user_meta8
WHERE
    a.meta_key = '_product_id'
    AND a.meta_value = PRODUCT_ID
    AND a.order_item_id = b.order_item_id
    AND customer_meta.meta_key = '_customer_user'
    AND customer_meta.post_id = b.order_id
    AND user_meta1.meta_key = 'first_name'
    AND user_meta1.user_id = users.id
    AND user_meta2.meta_key = 'last_name'
    AND user_meta2.user_id = users.id
    AND user_meta3.meta_key = 'billing_company'
    AND user_meta3.user_id = users.id
    AND user_meta4.meta_key = 'billing_address_1'
    AND user_meta4.user_id = users.id
    AND user_meta5.meta_key = 'billing_city'
    AND user_meta5.user_id = users.id
    AND user_meta6.meta_key = 'billing_postcode'
    AND user_meta6.user_id = users.id
    AND user_meta7.meta_key = 'billing_state'
    AND user_meta7.user_id = users.id
    AND user_meta8.meta_key = 'billing_phone'
    AND user_meta8.user_id = users.id
    AND users.ID = customer_meta.meta_value
    AND qty_table.meta_key = '_qty'
    AND qty_table.order_item_id = b.order_item_id
ORDER BY user_meta3.meta_value ASC

Necesito toda la información, ya que quiero enumerar a todos los usuarios con su nombre, apellido, empresa, dirección, código postal, etc. para un producto determinado que se ha comprado. Entonces, la consulta en sí misma funciona, pero es un asesino en el tiempo de proceso.

Podría usar max( CASE WHEN … … THEN …END ) como a_name pero solo sé cómo hacerlo con éxito si uso una combinación izquierda.

¿Algún consejo sobre cómo hacer que esta consulta funcione mejor?

WP, ¿estás escuchando? WooCommerce, ¿estás escuchando? Me estoy cansando de optimizar su aplicación de base de datos.

En primer lugar, EAV es un diseño de esquema terrible. Pero no voy a despotricar sobre eso. Solo señalaré los índices que probablemente falten o estén mal formados:

wp_usermeta:  PRIMARY KEY(user_id, meta_key)

Sin ninguna (191) tachuelas en.

Del mismo modo para wp_woocommerce_order_itemmeta.

Puede que tenga más abusos que repartir; Por favor proporcione SHOW CREATE TABLE para las tablas que se utilizan.

  • ¡Gracias! Al agregar el índice en ambos, resolvió la consulta lenta y los muestra rápidamente.

    – Zhakal

    21 de febrero de 2017 a las 20:26

  • ¡Ahora a convencer a WP y Woo para que incluyan esos índices!

    –Rick James

    21 de febrero de 2017 a las 22:48

  • Más sobre cómo mejorar el postmeta: mysql.rjweb.org/doc.php/…

    –Rick James

    31 de mayo de 2020 a las 16:49

  • o dejar wordpress.org/plugins/index-wp-mysql-para-velocidad hacer los ALTER por ti.

    –Rick James

    31 oct 2021 a las 15:20

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad