问题描述
||
我有以下查询:
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
查询获得最大的datelast值,并从每个ID的最大datestart值中减去该值(这是用户会话的长度),然后取平均值。
最外面的查询仅用于平均结果时间。有什么方法可以优化此查询?
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
解决方法
第一个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)键(始终将限制性最强的字段放在第一位,以提高选择性)来优化查询。