我编写了两个结果相同的查询,在运行它们时,它们的性能是相同的。虽然我很好奇效率是不是两者都一样,因为我无法想象它们是一样的。
我觉得这个效率比较低:
SELECT post.ID,
post.post_title ticket_id,
(SELECT meta_value
FROM wp_postmeta post_meta
WHERE post_meta.post_id = post.ID
&& post_meta.meta_key = "WooCommerceEventsPurchaserFirstName") first_name,
(SELECT meta_value
FROM wp_postmeta post_meta
WHERE post_meta.post_id = post.ID
&& post_meta.meta_key = "WooCommerceEventsPurchaserLastName") last_name,
(SELECT meta_value
FROM wp_postmeta post_meta
WHERE post_meta.post_id = post.ID
&& post_meta.meta_key = "WooCommerceEventsPurchaserEmail") email,
(SELECT meta_value
FROM wp_postmeta post_meta
WHERE post_meta.post_id = post.ID
&& post_meta.meta_key = "WooCommerceEventsPurchaserPhone") phone,
(SELECT meta_value
FROM wp_postmeta post_meta
WHERE post_meta.post_id = post.ID
&& post_meta.meta_key = "WooCommerceEventsProductID") product_id,
(SELECT meta_value
FROM wp_postmeta post_meta
WHERE post_meta.post_id = post.ID
&& post_meta.meta_key = "WooCommerceEventsVariations") ticket_type,
(SELECT meta_value
FROM wp_postmeta
WHERE post_id = product_id
&& meta_key = "_sku") SKU
FROM wp_posts post
WHERE post_type = "event_magic_tickets"
因为我做的(select)查询较少,但我做的连接比select重?
SELECT post.ID ID,
post.post_title ticket_id,
customers.*,
(SELECT meta_value
FROM wp_postmeta
WHERE post_id = product_id
&& meta_key = "_sku") SKU
FROM wp_posts post
LEFT JOIN (SELECT post_id id,
MAX(CASE WHEN meta_key = 'WooCommerceEventsPurchaserFirstName' THEN meta_value END) first_name,
MAX(CASE WHEN meta_key = 'WooCommerceEventsPurchaserLastName' THEN meta_value END) last_name,
MAX(CASE WHEN meta_key = 'WooCommerceEventsPurchaserEmail' THEN meta_value END) email,
MAX(CASE WHEN meta_key = 'WooCommerceEventsPurchaserPhone' THEN meta_value END) phone,
MAX(CASE WHEN meta_key = 'WooCommerceEventsProductID' THEN meta_value END) product_id,
MAX(CASE WHEN meta_key = 'WooCommerceEventsVariations' THEN meta_value END) ticket_type
FROM wp_postmeta post_meta
GROUP BY post_id) customers
ON customers.id = post.id
WHERE post_type = "event_magic_tickets";
有人能告诉我哪一个更有效,为什么(也许我该如何衡量这一点,这样我将来就能自己做了)。我用mariadb以防万一。。
2条答案
按热度按时间du7egjpx1#
你需要测试你的数据和你的系统,看看哪个工作得更好。他们肯定会有不同的执行计划。
作为这类查询的一般规则,一个或两个联接通常比聚合快。但是,聚合查询的伸缩性更好——也就是说,它开始的速度很慢,但是每个新列只需要很小的工作量。
不过,我注意到,您在过滤之前正在进行聚合。这可能意味着您正在聚合大量不需要聚合的帖子,而且额外的工作是昂贵的。您确实希望在聚合之前尽可能多地过滤数据。
vecaoik12#
这两种方法都可以通过适当地修改索引来加快速度。关键是要有
(post_id, meta_key)
. 更多详细信息:http://mysql.rjweb.org/doc.php/index_cookbook_mysql#speeding_up_wp_postmeta另外,检查是否有以开头的索引
post_type
.为进一步讨论,请提供
SHOW CREATE TABLE
有关表格。