MySQL 中带有 GROUP BY 的子查询非常慢
Very slow subquery in MySQL with GROUP BY
我知道了 SQL:
SELECT COUNT( d.id ) AS sum, d.user_agent
FROM debug AS d
WHERE d.id IN (
SELECT MAX(d2.id)
FROM debug AS d2
GROUP BY d2.user_id
)
GROUP BY d.user_agent
我想获取相似用户代理的数量,但只需要每个用户最后一个条目的用户代理数量。
=> 计数(d.id)
=> 分组依据 d2.user_id
我尝试将两个 SQL 分开,并将子查询的响应写在另一个查询中。执行时间远低于一秒。
两者一起约 25 秒。
我的table结构:
CREATE TABLE `debug` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`event` varchar(127) NOT NULL,
`user_id` int(11) NOT NULL,
`user_agent` varchar(255) NOT NULL,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`parameters` varchar(5000) NOT NULL,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
KEY `user_agent` (`user_agent`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SQL-Fiddle:
Here
有什么优化方法吗?
这样更好吗?
SELECT x.user_agent
, COUNT(*) total
FROM debug x
JOIN
( SELECT user_id
, MAX(id) max_id
FROM debug
GROUP
BY user_id
) y
ON y.user_id = x.user_id
AND y.max_id = x.id
GROUP BY user_agent;
我知道了 SQL:
SELECT COUNT( d.id ) AS sum, d.user_agent
FROM debug AS d
WHERE d.id IN (
SELECT MAX(d2.id)
FROM debug AS d2
GROUP BY d2.user_id
)
GROUP BY d.user_agent
我想获取相似用户代理的数量,但只需要每个用户最后一个条目的用户代理数量。
=> 计数(d.id)
=> 分组依据 d2.user_id
我尝试将两个 SQL 分开,并将子查询的响应写在另一个查询中。执行时间远低于一秒。 两者一起约 25 秒。
我的table结构:
CREATE TABLE `debug` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`event` varchar(127) NOT NULL,
`user_id` int(11) NOT NULL,
`user_agent` varchar(255) NOT NULL,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`parameters` varchar(5000) NOT NULL,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
KEY `user_agent` (`user_agent`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SQL-Fiddle: Here
有什么优化方法吗?
这样更好吗?
SELECT x.user_agent
, COUNT(*) total
FROM debug x
JOIN
( SELECT user_id
, MAX(id) max_id
FROM debug
GROUP
BY user_id
) y
ON y.user_id = x.user_id
AND y.max_id = x.id
GROUP BY user_agent;