【问题标题】:Slow to get max and min values related to parameters of each row获取与每行参数相关的最大值和最小值很慢
【发布时间】:2023-03-17 23:15:02
【问题描述】:

我需要获取某些跟踪数据,包括几个最大值和最小值。我已经有一个可怕的方法来做到这一点,但是你知道这真的很慢,因为我正在使用子查询并且表有几千行。具体来说,我需要根据当前行的 type_dev 获得每行不同的 MAX 值。如果有 24000 条记录,它会变得无法使用,而且我认为当我尝试使用 MAX 子句时会更慢。

SELECT dt.some_data, dt.date_visit, dt.url, 
      (SELECT date_visit FROM device_tracker 
       WHERE type_dev = dt.type_dev ORDER BY date_visit DESC LIMIT 1) last_visit,
      (SELECT date_visit FROM device_tracker 
       WHERE type_dev = dt.type_dev and url = dt.url ORDER BY date_visit DESC LIMIT 1) last_visit_to_this_url 
   FROM device_tracker dt WHERE some_where_clauses;

请注意,我不需要全局最大值(这可能很容易),但例如在这种情况下,我得到了每个 type_dev 的最大日期(每一行可以是不同的类型)以及关于每一行的某个 url 的最大日期。

我需要与最短日期相同。

当然有很多更好的方法可以做到这一点。有人能解释一下吗?

【问题讨论】:

    标签: mysql max


    【解决方案1】:
    SELECT  *
    FROM    (
            SELECT  type_dev, MAX(date_visit) AS maxt, MIN(date_visit) AS mint
            FROM    device_tracker
            GROUP BY
                    type_dev
            ) t
    JOIN    (
            SELECT  type_dev, url, MAX(date_visit) AS maxtu, MIN(date_visit) AS mintu
            FROM    device_tracker
            GROUP BY
                    type_dev, url
            ) tu
    ON      tu.type_dev = t.type_dev
    JOIN    device_tracker dt
    ON      dt.type_dev = tu.type_dev
            AND dt.url = tu.url
    

    (type_dev, url, date_visit) 上创建一个复合索引以使其快速工作。

    【讨论】:

    • 这太棒了。像魅力一样工作。即使没有复合索引,它也快得多。谢谢!
    • @Javier:尝试添加复合索引,看看区别。
    • 我实际上已经这样做了,我的意思是,在您的解决方案中,我什至在设置索引之前就看到了巨大的差异。设置后效果会好一些。谢谢!
    猜你喜欢
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 2015-01-09
    相关资源
    最近更新 更多