5


你好!
我需要在 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 分组
4

1 回答 1

4

GROUP BY main_id, key与 相比,Yes的执行速度要快很多倍INSERT IGNORE

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

于 2012-09-11T07:57:58.780 回答