Mysql 优化自定义Wordpress SQL查询以获取用户元数据
我有下面的查询,它可以工作。但由于它的堆积,处理起来要花很长时间。因此,我需要帮助,以便更快地查询 SQL查询 在查询中,产品ID应替换为“”和产品ID号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_
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的信息: