首页 > 解决方案 > 从最近 3 个访问日期(最后、上一个、之前)中选择数据 - 查询性能

问题描述

我正在尝试返回最近 3 次访问商店的 GPS 坐标。当前访问 上一次访问 在此之前访问。

挑战在于有 15,000 多家商店,每家商店都会在不同的日期(一年内)光顾。

就重新调整最后两次访问(当前和上一次)而言,我只写了我的查询,并且我已经面临着查询永远运行的效率问题。

我的查询返回了正确的数据集,但是由于运行时间非常长(几个小时),因此效率大大降低。

SELECT 
    MAX(ActionDate)     'VisitDate'
,   Store           'Store'
,   Route           'Route'
,   GPS         'GPS'
FROM 
    sys_data.mod_visit AA
WHERE 
    ActionDate  = (SELECT 
               MAX(ActionDate) FROM sys_data.mod_visit MX
               WHERE 
              ActionDate < (SELECT MAX(ActionDate) FROM sys_data.mod_visit WHERE Store = MX.Store)
               AND MX.Store = AA.Store 
                       GROUP BY 
             Store)
AND ActionDate < CURDATE()
AND YEAR(ActionDate) = YEAR(CURDATE())

store 和 actiondate 列都被索引。

我需要找到一种方法来更有效地运行此选择,以便我可以每天使用查询。

标签: mysqlperformancedategreatest-n-per-group

解决方案


The action date if is = ( subquery ) don't need AND ActionDate < CURDATE() (alreday use in subquery)

and istead of a where subquery you could try an inner join

    SELECT 
        MAX(ActionDate)     'VisitDate'
    ,   Store           'Store'
    ,   Route           'Route'
    ,   GPS         'GPS'
    FROM  sys_data.mod_visit AA
    INNER JOIN   (
      SELECT Store, MAX(ActionDate) max_date 
      FROM sys_data.mod_visit 
      WHERE  ActionDate < CURDATE()
      GROUP BY Store
    ) MX on MX.max_date  = AA.ActionDate 
          AND MX.store  = AA.store 
  WHERE YEAR(ActionDate) = YEAR(CURDATE())

anyway be sure you have proper composite index on

  table  sys_data.mod_visit  columns  (store , ActionDate)

推荐阅读