GROUP BY vs INSERT IGNORE

Posted

技术标签:

【中文标题】GROUP 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 了解更多信息。 【参考方案1】:

是的,GROUP BY main_id, key 的执行速度比 INSERT IGNORE 快很多倍。

SELECT.. GROUP BY main_id, key 将通过使用覆盖索引更快地执行并导致更少的记录数,而INSERT IGNORE 将涉及INDEX KEY 查找正在插入的每一行。

【讨论】:

感谢您的回答和解释!

以上是关于GROUP BY vs INSERT IGNORE的主要内容,如果未能解决你的问题,请参考以下文章

mySQL之group By的简单分析

postgresql----排序ORDER BY,分组GROUP BY,分页OFFSET&&LIMIT

SQL数据库中查询语句Order By和Group By有啥区别

INSERT IGNORE 与 INSERT INTO的区别

INSERT IGNORE 与INSERT INTO的区别

INSERT IGNORE 与INSERT INTO的区别