哪个sql查询更有效?为什么?

ibps3vxo  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(301)

我编写了两个结果相同的查询,在运行它们时,它们的性能是相同的。虽然我很好奇效率是不是两者都一样,因为我无法想象它们是一样的。
我觉得这个效率比较低:

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

du7egjpx

du7egjpx1#

你需要测试你的数据和你的系统,看看哪个工作得更好。他们肯定会有不同的执行计划。
作为这类查询的一般规则,一个或两个联接通常比聚合快。但是,聚合查询的伸缩性更好——也就是说,它开始的速度很慢,但是每个新列只需要很小的工作量。
不过,我注意到,您在过滤之前正在进行聚合。这可能意味着您正在聚合大量不需要聚合的帖子,而且额外的工作是昂贵的。您确实希望在聚合之前尽可能多地过滤数据。

vecaoik1

vecaoik12#

这两种方法都可以通过适当地修改索引来加快速度。关键是要有 (post_id, meta_key) . 更多详细信息:http://mysql.rjweb.org/doc.php/index_cookbook_mysql#speeding_up_wp_postmeta
另外,检查是否有以开头的索引 post_type .
为进一步讨论,请提供 SHOW CREATE TABLE 有关表格。

相关问题