优化自定义 WordPress SQL 查询以获取用户元数据

Zha*_*kal 5 mysql sql wordpress optimization query-optimization

我有以下查询并且它有效。但由于它的堆积,处理需要非常长的时间。因此,我需要帮助才能更快地获得此查询。

SQL查询

在查询中,产品_ID 应替换为“ ”和产品 ID 号。

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
Run Code Online (Sandbox Code Playgroud)

我需要所有信息,因为我想列出已购买的给定产品的所有用户及其名字、姓氏、公司、地址、邮政编码等。因此查询本身可以工作,但会浪费处理时间。

我可以使用 max( CASE WHEN ... ... THEN ...END ) 作为 a_name 但我只知道如果使用左连接如何成功完成它。

关于如何让这个查询更好地运行有什么建议吗?

Ric*_*mes 5

WP,你在听吗?WooCommerce,你在听吗?我厌倦了优化您的数据库应用程序。

首先,EAV 是一个糟糕的模式设计。但我不会对此抱怨。我只是指出可能丢失或格式错误的索引:

wp_usermeta:  PRIMARY KEY(user_id, meta_key)
Run Code Online (Sandbox Code Playgroud)

没有任何(191)附加。

同样对于wp_woocommerce_order_itemmeta.

我可能还有更多的谩骂要说;请提供SHOW CREATE TABLE正在使用的表格。

  • 或者让 https://wordpress.org/plugins/index-wp-mysql-for-speed/ 为您进行更改。 (3认同)