2013-03-04 99 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