【问题标题】:GROUP BY vs INSERT IGNOREGROUP BY vs INSERT IGNORE
【发布时间】:2012-09-04 02:43:52
【问题描述】:
你好!
我需要在 mysql (5.1) 上扫描一个非常大的表,
这就是表格或多或少的样子:
创建表`big_table`(
`id` BIGINT(11) NOT NULL AUTO_INCREMENT,
`main_id` INT(11) 默认为 NULL,
`key` VARCHAR(20) NOT NULL,
主键(`id`),
KEY `main_id_key` (`main_id`,`key`),
) 引擎=INNODB AUTO_INCREMENT=2315678197 默认字符集=utf8
我需要将 main_id + 键的所有唯一值放入一个新表中。
使用以下查询需要很长时间(3 天后仍在非常快的服务器上运行):
创建表`get_unique`(
`main_id` int(11) NOT NULL,
`key` varchar(20) NOT NULL,
主键(`main_id`,`key`)
) 引擎=InnoDB 默认字符集=utf8;
将忽略插入到 get_unique
SELECT main_id,key FROM big_table
所以我的问题是 -
这会更快吗?
创建表`get_unique`(
`main_id` int(11) NOT NULL,
`key` varchar(20) NOT NULL,
主键(`main_id`,`key`)
) 引擎=InnoDB 默认字符集=utf8;
插入到 get_unique
SELECT main_id,key FROM big_table
按 1,2 分组
【问题讨论】:
-
结果:INSERT IGNORE 在被杀死之前运行了超过 47 小时。 INSERT as SELECT ... GROUP BY 在 15 小时后完成运行。
-
如果您的目标是摆脱AUTO_INCREMENT 列`id` 以支持`main_id_key` 索引,并删除重复的行,那么您可以只使用ALTER IGNORE TABLE `big_table` ADD UNIQUE (`main_id`, `key`)。不需要像`get_unique` 这样的临时表。请参阅dev.mysql.com/doc/refman/5.1/en/alter-table.html 了解更多信息。
标签:
mysql