MySQL查询永远执行

时间:2019-12-21 11:52:41

标签: mysql database

我正在尝试提取一个简单的报告。我已经准备好查询,但是它要花很多时间才能执行。

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

请提出如何优化查询的建议。我在所有列上都有索引。

2 个答案:

答案 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中。