插入查询优化

时间:2012-02-20 05:16:54

标签: mysql sql group-by

我有一个包含~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

2 个答案:

答案 0 :(得分:2)

当前的MySQL查询优化器没有以最佳方式优化

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字段上创建一个索引 您在“分组依据”方法中使用单个字段