2013-03-04 249 views
1

我有一个表约50M行和格式:MySQL的INSERT INTO ... SELECT ... GROUP BY太慢

CREATE TABLE `big_table` (
    `id` BIGINT NOT NULL, 
    `t1` DATETIME NOT NULL, 
    `a` BIGINT NOT NULL, 
    `type` VARCHAR(10) NOT NULL, 
    `b` BIGINT NOT NULL, 
    `is_c` BOOLEAN NOT NULL, 
    PRIMARY KEY (`id`), 
    INDEX `a_b_index` (a,b) 
) ENGINE=InnoDB; 

我再定义表t2,没有索引:

Create table `t2` (
    `id` BIGINT NOT NULL, 
    `a` BIGINT NOT NULL, 
    `b` BIGINT NOT NULL, 
    `t1min` DATETIME NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

然后,我使用来自big_table的查询填充t2(这将增加大约12M行)。

insert into opportunities 
    (id, a,b,t1min) 
    SELECT id,a,b,min(t1) 
    FROM big_table use index (a_b_index) 
    where type='SUBMIT' and is_c=1 
    GROUP BY a,b; 

我发现,它需要这个查询大约一分钟处理5000不同(a,b)big_table
由于在big_table中有12M个不同的(a,b),因此运行 需要大约40个小时,查询全部为big_table

什么问题?

如果我只是做SELECT ...那么查询在大约2秒内做5000行。如果我是SELECT ... INTO OUTFILE ...,那么对于5000行,查询仍然需要60秒。

EXPLAIN SELECT ...给出:

id,select_type,table,type,possible_keys,key,key_len,ref,rows,Extra 
1,SIMPLE,stdnt_intctn_t,index,NULL,a_b_index,16,NULL,46214255,"Using where" 
+1

q1:只选择多长时间? – Sebas 2013-03-04 19:47:24

+1

q2:选择部分的解释计划是什么? – Sebas 2013-03-04 19:48:10

+0

'EXPLAIN SELECT ...'给出 – BvdS 2013-03-04 20:04:29

回答

1

我发现问题是GROUP_BY导致了big_table的随机访问读取过多。以下策略允许通过big_table连续旅行。首先,我们添加一键t2

Create table `t2` (
    `id` BIGINT NOT NULL, 
    `a` BIGINT NOT NULL, 
    `b` BIGINT NOT NULL, 
    `t1min` DATETIME NOT NULL, 
    PRIMARY KEY (a,b), 
    INDEX `id` (id) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

然后,我们用补t2

insert into t2 
    (id, a,b,t1min) 
    SELECT id,a,b,t1 
    FROM big_table 
    where type='SUBMIT' and is_c=1 
ON DUPLICATE KEY UPDATE 
    t1min=if(t1<t1min,t1,t1min), 
    id=if(t1<t1min,big_table.id,t2.id); 

产生的加速是几个数量级。

0

本集团可能是问题的一部分。您正在使用(a,b)上的索引,但您的位置未被使用。我会对

索引(类型,is_c,A,B)

而且,你所得到的 “ID”,但不能指定哪些...你可能想要做一个MIN(ID)以获得一致的结果。

+0

我尝试了'(type,is_c,a,b)'上的索引,并且花了大约一个小时才处理了5000行。我的猜测是,索引不再适合nnodb缓冲池(我的机器上是4GB)。 – BvdS 2013-03-05 04:41:36

+0

min(id)的想法很有帮助。 – BvdS 2013-03-05 04:42:06