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的主要内容,如果未能解决你的问题,请参考以下文章
postgresql----排序ORDER BY,分组GROUP BY,分页OFFSET&&LIMIT
SQL数据库中查询语句Order By和Group By有啥区别