我有以下查询:
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
答案 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)键来优化查询(始终将最具限制性的字段放在第一位,以提高选择性)。