提问者:小点点

哪种SQL查询效率更高,为什么?


我写了两个结果相同的查询,当我运行它们时,两个查询的性能都是相等的。 但我很好奇,两者的效率是否相同,因为我无法想象它们是一样的。

我觉得这个效率比较低:

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以防万一。。。


共1个答案

匿名用户

您需要测试您的数据和您的系统,看看哪个工作得更好。 他们肯定会有不同的执行计划。

作为这种类型查询的一般规则,一个或两个联接通常比聚合更快。 但是,聚合查询的伸缩性更好--也就是说,它开始时很慢,但是每个新列只需要很小的工作量。

不过,我注意到,您在筛选之前进行了聚合。 这很可能意味着你要聚合很多不需要聚合的帖子--而且额外的工作是昂贵的。 您确实希望在聚合之前尽可能多地筛选数据。