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
結果:INSERT IGNORE在被殺之前已經跑了47個多小時。 INSERT as SELECT ... GROUP BY 15小時後完成運行。 – Mistdemon
如果你的目標是爲''''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