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

Mysql 优化自定义Wordpress SQL查询以获取用户元数据,mysql,sql,wordpress,optimization,query-optimization,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_

我有下面的查询,它可以工作。但由于它的堆积,处理起来要花很长时间。因此,我需要帮助,以便更快地查询

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
我需要所有的信息,因为我想列出所有用户的名字,姓氏,公司,地址,邮政编码等一个给定的产品已经购买。因此,查询本身是有效的,但在处理时间上却是一个杀手

我可以使用max(CASE WHEN…THEN…END)作为一个_名称,但我只知道如果我使用左连接,如何成功地实现它


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

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

首先,EAV是一个糟糕的模式设计。但我不会为此大发雷霆。我只想指出可能缺失或格式错误的索引:

wp_usermeta:  PRIMARY KEY(user_id, meta_key)
没有任何附加的
(191)

类似地,对于
wp\u woodcommerce\u order\u itemmeta


我可能有更多的辱骂要说;请为正在使用的表提供
SHOW CREATE TABLE

添加Rick James描述的索引将使原始查询更快

但我已成功地将其更改为使用LEFT JOIN,这是迄今为止最快的,如果其他人需要它,请在此处显示:

SELECT
  b.order_id, 
  customer_meta.meta_value as customer_id,
  u.display_name as customer_name,
  u.user_email, 
  qty_table.meta_value as qty,
  um_last_name.meta_value as last_name,
  um_first_name.meta_value as first_name,
  um_address1.meta_value as address1,
  um_address2.meta_value as address2,
  um_address_city.meta_value as city,
  um_address_state.meta_value as state,
  um_company.meta_value as company,
  um_email.meta_value as billing_email
FROM wp_woocommerce_order_itemmeta a
  LEFT JOIN wp_woocommerce_order_items b on a.order_item_id = b.order_item_id
  LEFT JOIN wp_postmeta customer_meta on customer_meta.post_id = b.order_id AND customer_meta.meta_key = '_customer_user'
  LEFT JOIN wp_users u on u.ID = customer_meta.meta_value
  LEFT JOIN wp_woocommerce_order_itemmeta qty_table on qty_table.order_item_id = b.order_item_id and qty_table.meta_key = '_qty'
  LEFT JOIN wp_usermeta um_last_name on u.ID = um_last_name.user_id and um_last_name.meta_key = 'last_name'
  LEFT JOIN wp_usermeta um_first_name on u.ID = um_first_name.user_id and um_first_name.meta_key = 'first_name'
  LEFT JOIN wp_usermeta um_address1 on u.ID = um_address1.user_id and um_address1.meta_key = 'billing_address_1'
  LEFT JOIN wp_usermeta um_address2 on u.ID = um_address2.user_id and um_address2.meta_key = 'billing_address_2'
  LEFT JOIN wp_usermeta um_address_city on u.ID = um_address_city.user_id and um_address_city.meta_key = 'billing_city'
  LEFT JOIN wp_usermeta um_address_state on u.ID = um_address_state.user_id and um_address_state.meta_key = 'billing_state'
  LEFT JOIN wp_usermeta um_email on u.ID = um_email.user_id and um_email.meta_key = 'billing_email'
  LEFT JOIN wp_usermeta um_company on u.ID = um_company.user_id and um_company.meta_key = 'billing_company'
WHERE
  a.meta_key = '_product_id' AND a.meta_value = PRODUCT_ID

非常感谢。通过在这两个索引中添加索引,它解决了查询速度慢的问题,并且显示速度快。现在说服WP和Woo包含这些索引!!更多关于改进PosteTa的信息: