我正在尝试提取一个简单的报告。我已经准备好查询,但是它要花很多时间才能执行。
PFB查询:-
select sc.product_name as product_name,
(select count(id) from hg_scratch_card
where product_name=sc.product_name
and (review_received_date between '2019-12-01'
and '2019-12-21') ) as RR_COUNT,
(select count(id) from hg_scratch_card
where product_name=sc.product_name
and (review_updated_date between '2019-12-01'
and '2019-12-21') ) as RU_COUNT
from hg_scratch_card sc
where sc.product_name !=''
order by RR_COUNT desc
limit 3
请提出如何优化查询的建议。我在所有列上都有索引。
答案 0 :(得分:3)
如果每个product_name
都需要1行,则应该group by product_name
并使用条件聚合:
select product_name,
sum(review_received_date between '2019-12-01' and '2019-12-21') as RR_COUNT,
sum(review_updated_date between '2019-12-01' and '2019-12-21') as RU_COUNT
from hg_scratch_card
where product_name !=''
group by product_name
order by RR_COUNT desc
limit 3
答案 1 :(得分:0)
对于OP的原始查询:
INDEX(product_name, review_received_date)
INDEX(product_name, review_updated_date)
对于forpas的查询:
INDEX(product_name, review_received_date, review_updated_date)
(并且仅因为它正在“覆盖”)
从名称猜测,我希望review_received_date
总是在review_updated_date
之前。在那种情况下,任何一种配方都会受益于
AND review_received_date >= '2019-12-01'
在外部 WHERE
中。