如何解决Mysql优化查询:尝试获取子查询的平均值
|| 我有以下查询: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)键(始终将限制性最强的字段放在第一位,以提高选择性)来优化查询。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。