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

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

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

  1. SELECT post.ID,
  2. post.post_title ticket_id,
  3. (SELECT meta_value
  4. FROM wp_postmeta post_meta
  5. WHERE post_meta.post_id = post.ID
  6. && post_meta.meta_key = "WooCommerceEventsPurchaserFirstName") first_name,
  7. (SELECT meta_value
  8. FROM wp_postmeta post_meta
  9. WHERE post_meta.post_id = post.ID
  10. && post_meta.meta_key = "WooCommerceEventsPurchaserLastName") last_name,
  11. (SELECT meta_value
  12. FROM wp_postmeta post_meta
  13. WHERE post_meta.post_id = post.ID
  14. && post_meta.meta_key = "WooCommerceEventsPurchaserEmail") email,
  15. (SELECT meta_value
  16. FROM wp_postmeta post_meta
  17. WHERE post_meta.post_id = post.ID
  18. && post_meta.meta_key = "WooCommerceEventsPurchaserPhone") phone,
  19. (SELECT meta_value
  20. FROM wp_postmeta post_meta
  21. WHERE post_meta.post_id = post.ID
  22. && post_meta.meta_key = "WooCommerceEventsProductID") product_id,
  23. (SELECT meta_value
  24. FROM wp_postmeta post_meta
  25. WHERE post_meta.post_id = post.ID
  26. && post_meta.meta_key = "WooCommerceEventsVariations") ticket_type,
  27. (SELECT meta_value
  28. FROM wp_postmeta
  29. WHERE post_id = product_id
  30. && meta_key = "_sku") SKU
  31. FROM wp_posts post
  32. WHERE post_type = "event_magic_tickets"

因为我做的(select)查询较少,但我做的连接比select重?

  1. SELECT post.ID ID,
  2. post.post_title ticket_id,
  3. customers.*,
  4. (SELECT meta_value
  5. FROM wp_postmeta
  6. WHERE post_id = product_id
  7. && meta_key = "_sku") SKU
  8. FROM wp_posts post
  9. LEFT JOIN (SELECT post_id id,
  10. MAX(CASE WHEN meta_key = 'WooCommerceEventsPurchaserFirstName' THEN meta_value END) first_name,
  11. MAX(CASE WHEN meta_key = 'WooCommerceEventsPurchaserLastName' THEN meta_value END) last_name,
  12. MAX(CASE WHEN meta_key = 'WooCommerceEventsPurchaserEmail' THEN meta_value END) email,
  13. MAX(CASE WHEN meta_key = 'WooCommerceEventsPurchaserPhone' THEN meta_value END) phone,
  14. MAX(CASE WHEN meta_key = 'WooCommerceEventsProductID' THEN meta_value END) product_id,
  15. MAX(CASE WHEN meta_key = 'WooCommerceEventsVariations' THEN meta_value END) ticket_type
  16. FROM wp_postmeta post_meta
  17. GROUP BY post_id) customers
  18. ON customers.id = post.id
  19. 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 有关表格。

相关问题