2012-09-11 62 views
4


嗨!
我需要掃描在MySQL(5.1),一個非常大的表,
這是表的樣子或多或少:
GROUP BY和INSERT IGNORE

 
CREATE TABLE `big_table` (
    `id` BIGINT(11) NOT NULL AUTO_INCREMENT, 
    `main_id` INT(11) DEFAULT NULL, 
    `key` VARCHAR(20) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `main_id_key` (`main_id`,`key`), 
) ENGINE=INNODB AUTO_INCREMENT=2315678197 DEFAULT CHARSET=utf8 

我需要得到main_id +按鍵的所有唯一值成新表。
使用下面的查詢需要(非常快的服務器上後3天仍在運行)大量的時間:

 
CREATE TABLE `get_unique` (
    `main_id` int(11) NOT NULL, 
    `key` varchar(20) NOT NULL, 
    PRIMARY KEY (`main_id`,`key`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

INSERT IGNORE INTO get_unique 
SELECT main_id,key FROM big_table 

所以我的問題是 -
這會不會更快?

 
CREATE TABLE `get_unique` (
    `main_id` int(11) NOT NULL, 
    `key` varchar(20) NOT NULL, 
    PRIMARY KEY (`main_id`,`key`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

INSERT INTO get_unique 
SELECT main_id,key FROM big_table 
GROUP BY 1,2 
+0

結果:INSERT IGNORE在被殺之前已經跑了47個多小時。 INSERT as SELECT ... GROUP BY 15小時後完成運行。 – Mistdemon

+0

如果你的目標是爲''''main_id_key''索引擺脫'AUTO_INCREMENT'列'\'id \''並刪除重複的行,那麼你可以使用'ALTER IGNORE TABLE \ 'big_table \'ADD UNIQUE(\'main_id \',\'key \')'。不需要像'\'get_unique \''這樣的臨時表。 有關更多信息,請參見http://dev.mysql.com/doc/refman/5.1/en/alter-table.html。 – Kim

回答

3

相比INSERT IGNOREGROUP BY main_id, key將執行快許多倍。

SELECT.. GROUP BY main_id, key通過使用覆蓋索引並導致更少數量的記錄可以更快地執行,而INSERT IGNORE將涉及INDEX KEY查找正在插入的每一行。

+0

謝謝你的回答和解釋! – Mistdemon