大佬教程收集整理的这篇文章主要介绍了使用 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_category
和 oc_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,请注明来意。