程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了使用 CASE WHEN 更快地进行查询大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决使用 CASE WHEN 更快地进行查询?

开发过程中遇到使用 CASE WHEN 更快地进行查询的问题如何解决?下面主要结合日常开发的经验,给出你关于使用 CASE WHEN 更快地进行查询的解决方法建议,希望对你解决使用 CASE WHEN 更快地进行查询有所启发或帮助;

我有这个查询

SELECT t1.date_added,t1.order_ID,t1.firstname AS customer,t1.name AS product_name,t1.category,t1.supplier,t1.quantity,t1.price,t1.@R_658_10586@l
FROM (
     select o.date_added,op.order_ID,o.firstname,op.name,op.price,op.@R_658_10586@l,op.quantity,m.name AS supplier,(CASE WHEN skps.buy_price IS NulL THEN (SELECT skps2.buy_price FROM `oc_stock_kps` skps2 WHERE skps2.buy_price != '0' ORDER BY skps2.ID DESC liMIT 1)
           ELSE skps.buy_price
           END) AS buy_price,(SELECT @R_696_2825@T(cd.name SEParaTOR ' / ') FROM oc_category_description cd left JOIN product_to_category ptc ON (ptc.category_ID = cd.category_ID) WHERE ptc.product_ID = p.product_ID) AS category,LAG(op.Name) OVER(ORDER BY op.order_product_ID) prev
FROM `oc_order_product` op
left JOIN oc_order o ON (op.order_ID = o.order_ID)
left JOIN oc_product p ON (op.product_ID = p.product_ID)
left JOIN oc_manufacturer m ON (p.manufacturer_ID = m.manufacturer_ID)
left JOIN oc_stock_kps skps ON (skps.product_ID = op.product_ID AND skps.order_ID = op.order_ID)
WHERE (o.date_added betweeN '2021-02-01 00:00:00' AND '2021-02-28 23:59:00')
    AND p.product_ID != '0'
    AND o.order_status_ID = '5'
) t1
WHERE t1.prev IS NulL OR t1.name<>t1.prev
ORDER BY t1.date_added
liMIT 12

问题是每次我用这个

(CASE WHEN skps.buy_price IS NulL
    THEN (SELECT skps2.buy_price FROM `oc_stock_kps` skps2
                WHERE skps2.buy_price != '0'
                ORDER BY skps2.ID DESC liMIT 1)
    ELSE skps.buy_price
    END) AS buy_price,

还有这个

left JOIN oc_stock_kps skps
     ON (skps.product_ID = op.product_ID
     AND skps.order_ID = op.order_ID)

查询时间太长。
有什么办法可以让它更快吗?

解决方法

缓慢可能出在 CASE 的子查询中,而不是 CASE 本身。

要添加的复合和覆盖索引。将列按给定的顺序排列:

o:  (order_status_id,date_added,order_id,firstName)
skps:  (order_id,product_id,buy_pricE)
p:  (product_id,manufacturer_id)

如果 product_to_categoryoc_order_product 是多对多映射表,请参阅此处优化索引的规则:http://mysql.rjweb.org/doc.php/index_cookbook_mysql#many_to_many_mapping_table

我不认为这里需要分组:

@R_696_2825@T(cd.name SEPARATOR ' / ')

进行这些更改后,如果您想进一步讨论,请为每个表提供 SHOW @R_674_2102@。和 EXPLAIN SELECT ... 用于查询。

每个表有多少行?结果中有多少没有最后的 LIMIT 12

,

使用 CTE 可能有一些好处。如果不是在性能方面,至少在可读性方面。但是为了更好地了解瓶颈所在,您应该获得执行计划 EXPLAIN SELECT。您可能还需要额外的索引,但如果不了解表结构和数据量,就很难判断。

为什么要引用显然是整数的字段?这可能是您问题的一部分,here is why。日期值应该被引用,这是可以的,但没有数字。

大佬总结

以上是大佬教程为你收集整理的使用 CASE WHEN 更快地进行查询全部内容,希望文章能够帮你解决使用 CASE WHEN 更快地进行查询所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:使用