我有一个包含~2M行的表。它具有B树主键(id,round)和另外2个(似乎无关紧要)索引。
我的问题是:
insert into a1
select * from cars
where (id, round) in (select id, min(round) from cars group by id)
以上查询需要大约30秒才能运行 但为什么以下查询
insert into a1
select * from cars
where (id, round) in (select id, max(round) from cars group by id)
似乎需要永远运行?我等了好几个小时。我唯一改变的是min-> max
PS:这是创建表
CREATE TABLE `cars` (
`id` int(11) NOT NULL,
`make` varchar(128) NOT NULL,
`miles` varchar(128) NOT NULL,
`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`round` int(11) NOT NULL,
`location` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`,`round`),
KEY `time` (`time`),
KEY `make` (`make`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
答案 0 :(得分:2)
IN
个子查询。
我会用:
INSERT INTO a1
SELECT c.*
FROM
cars AS c
JOIN
( SELECT id, MAX(round) AS round
FROM cars
GROUP BY id
) AS m
ON (m.id, m.round) = (c.id, c.round)
您在(id, round)
上已有的索引将使子查询运行得非常快且只运行一次(作为派生表)。另一方面,使用IN
,子查询对cars
表的每一行运行一次(这就是为什么它很慢)。使用EXPLAIN
检查执行计划。
答案 1 :(得分:0)
请在id字段上创建一个索引 您在“分组依据”方法中使用单个字段