我写了两个结果相同的查询,当我运行它们时,两个查询的性能都是相等的。 但我很好奇,两者的效率是否相同,因为我无法想象它们是一样的。
我觉得这个效率比较低:
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 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以防万一。。。
您需要测试您的数据和您的系统,看看哪个工作得更好。 他们肯定会有不同的执行计划。
作为这种类型查询的一般规则,一个或两个联接通常比聚合更快。 但是,聚合查询的伸缩性更好--也就是说,它开始时很慢,但是每个新列只需要很小的工作量。
不过,我注意到,您在筛选之前进行了聚合。 这很可能意味着你要聚合很多不需要聚合的帖子--而且额外的工作是昂贵的。 您确实希望在聚合之前尽可能多地筛选数据。