SQL date_sub与datediff在日期窗口中的性能

问题描述 投票:0回答:1

我正在尝试查看过去30天产品的活跃用户数量(玩具示例)。

我正在考虑两种方法。

一个,date_sub用于查找结束日期之前29天(间隔为30天,包括开始日期)。然后,由该较早的日期和结束日期定义where窗口。

这是示例:

SELECT 
    activity_date AS day, 
    COUNT(DISTINCT user_id) AS active_users
FROM Activity
WHERE 
    activity_date 
        BETWEEN 
            DATE_SUB(DATE("2019-07-27"), INTERVAL 29 DAY) 
                AND 
            DATE("2019-07-27") 

第二种方法是从开始日期计算datediff,然后将where子句限制为上一个时间段。

# Write your MySQL query statement below
SELECT
    activity_date as day,
    COUNT(DISTINCT user_id) AS active_users
FROM Activity
WHERE 
    datediff('2019-07-27', activity_date) < 30
        and
    activity_date <= '2019-07-27'

我不知道哪个是更好的选择。我希望其他人能参与进来。

mysql datediff date-sub
1个回答
1
投票

使用第一个选项:

activity_date 
    BETWEEN DATE_SUB(DATE("2019-07-27"), INTERVAL 29 DAY) 
    AND DATE("2019-07-27") 

这会将存储的值直接与日期分类比较。这样的表达式可以利用date列上的索引。

In,对照第二个表达式,将日期函数datediff()应用到date列。这使表达式不可SARGable,这意味着它将不会使索引受益:

datediff('2019-07-27', activity_date) < 30
and activity_date <= '2019-07-27'

请注意,第一个表达式可以简单地写成:

activity_date >= '2019-07-27' - interval 29 day
and activity_date <= '2019-07-27'

我不确定第二个比较是否应该是>=而不是>。之所以有意义,是因为activitydate没有时间成分。但我建议使用<,因为它在两种情况下都适用;如果要在包含'2019-07-27'之前保留数据,可以执行以下操作:

activity_date >= '2019-07-27' - interval 29 day
and activity_date < '2019-07-28'
© www.soinside.com 2019 - 2024. All rights reserved.