【问题标题】: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


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回答和解释!
猜你喜欢
  • 1970-01-01
  • 2015-07-30
  • 2019-01-27
  • 2017-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 2010-10-07
相关资源
最近更新 更多