Mysql优化查询:尝试获取子查询的平均值

时间:2011-04-13 10:43:10

标签: mysql optimization subquery aggregate-functions average

我有以下查询:

SELECT AVG(time) FROM 
(SELECT UNIX_TIMESTAMP(max(datelast)) - UNIX_TIMESTAMP(min(datestart)) AS time
    FROM table
    WHERE id IN 
        (SELECT DISTINCT id
            FROM table
            WHERE product_id = 12394 AND datelast > '2011-04-13 00:26:59'
        )
GROUP BY id
)
as T

查询获取最大的日期戳值,并从每个ID(即用户会话的长度)的最大日期开始值中减去该值,然后对其进行平均。

最外面的查询只是平均结果时间。有没有办法优化这个查询?

EXPLAIN的输出:

id  select_type         table       type            possible_keys           key     key_len ref     rows    extra
1   PRIMARY             <derived2>  ALL             NULL                    NULL    NULL    NULL    7   
2   DERIVED             table       index           NULL                    id      16      NULL    26      Using where
3   DEPENDENT SUBQUERY  table       index_subquery  id,product_id,datelast  id      12      func    2       Using index; Using where

1 个答案:

答案 0 :(得分:0)

第一个SELECT真的有必要吗?

SELECT
  AVG(time)
FROM 
(
  SELECT
    UNIX_TIMESTAMP(max(datelast)) - UNIX_TIMESTAMP(min(datestart)) AS time
  FROM
    table
  WHERE
    product_id = 12394 AND datelast > '2011-04-13 00:26:59'
  GROUP BY
    id
)

我现在无法测试,我认为它也会起作用。否则,您的查询看起来不错。

您可以通过添加(datelast,product_id)键来优化查询(始终将最具限制性的字段放在第一位,以提高选择性)。