2016-12-22 59 views
2

我试图让查询更高效地运行并返回有效的结果。当我在特定列中包含COUNT函数时,我当前的查询需要10多分钟才能完成。我也注意到,在计数时,所有结果都返回为NULL。查询效率 - 计数

当我自己运行COUNT部分时,完成时间不到一秒钟,我得到正确的结果。

这里是我使用的查询:

SELECT 
    x.entityCode 'Entity Code' 
, (SELECT MAX(visit_date) AS secMaxDate FROM z_dev.entities_visited 
      WHERE entity_code = x.entityCode AND visit_date < x.maxDate) ' Previous Visit Date' 
, x.maxDate 'Latest Visit Date' 
, cycle_end_date 'Cycle End Date' 
, total_visits 'Total Visits (28 Days)' 
FROM 
    (SELECT 
     entity_code AS storeCode 
    , MAX(visit_date) AS maxDate 
    , MAX(cycle_end_date) AS cycle_end_date 
    , (SELECT COUNT(visit_date) FROM z_dev.entities_visited A 
      WHERE visit_date BETWEEN DATE(DATE_SUB(CURDATE(), INTERVAL 28 DAY)) AND DATE(DATE_SUB(CURDATE(), INTERVAL 0 DAY) AND A.entity_code = B.entity_code) 
      GROUP BY entity_code) AS 'total_visits' 
    FROM 
     z_dev.entities_visited B GROUP BY entity_code) AS X; 

样本数据

entity_code | visit_date | cycle_end_date 
------------+------------+--------------- 
108792  |2016-12-07 |2016-12-11  
108793  |2016-12-08 |2016-12-11  
108795  |2016-12-06 |2016-12-11  
108796  |2016-12-05 |2016-12-11  
108795  |2016-12-13 |2016-12-18  
108792  |2016-12-14 |2016-12-18  
108793  |2016-12-14 |2016-12-18  
108796  |2016-12-16 |2016-12-18 



    Field   | Type  | Key 
    ----------------+-----------+--------------- 
    entity_code  |bigint(10) |MUL 
    visit_date  |date  |  
    cycle_end_date |date  |MUL  

的总访问次数的计数是我添加到查询解决方案,我与昨天辅助部分。基本上我想看到的是以下三件事情:

  • 当被访问了实体的最后日期(目前由 x.maxDate给出)
  • 当是最后的实体之前,参观人数最多最近 访问(目前由“先前的访问日期”定)
  • 多少次是实体过去28天内

当前问题方面富有经验访问/结果

  • 慢查询时间(10分钟+)
  • 算子查询返回的所有NULL值
  • 数查询运行在它自己的回报预期的结果在几个预期结果在几秒钟内
  • 主查询返回秒
+1

如果您可以让我们知道您正在计算的内容,这将有所帮助。您当前的查询看起来效率低下并且很混乱。也许我们可以给你一个更好的替代方案。 –

+0

Gut反应表示确保你在'entities_visited'上有一个索引'(entity_code,visit_date DESC)',但是对于所有性能问题,你可以在你的查询中发布当前索引和'EXPLAIN'的结果? –

+0

谢谢你们,我添加了一些额外的信息 –

回答

0

谢谢,我想我一直在想这个问题,这就是为什么我没有得到预期的结果。

我现在有我的查询按预期方式运行。

SELECT 
    x.entityCode 'Entity Code' 
, (SELECT MAX(visit_date) AS secMaxDate FROM z_dev.entities_visited 
      WHERE entity_code = x.entityCode AND visit_date < x.maxDate) ' Previous Visit Date' 
, x.maxDate 'Latest Visit Date' 
, cycle_end_date 'Cycle End Date' 
, visits 'Total Visits (28 Days)' 
FROM 
    (SELECT 
     entity_code AS entityCode 
    , MAX(visit_date) AS maxDate 
    , MAX(cycle_end_date) AS cycle_end_date 
    , (SELECT COUNT(visit_date) AS visits WHERE visit_date BETWEEN DATE(DATE_SUB(CURDATE(), INTERVAL 28 DAY)) AND DATE(DATE_SUB(CURDATE(), INTERVAL 0 DAY))) AS visits 
    FROM 
     z_dev.entities_visited B GROUP BY entity_code) AS X 
GROUP BY 
    x.entityCode;