mysql - GROUP BY 与 INSERT IGNORE

标签 mysql


嗨!
我需要在 mysql (5.1) 上扫描一个非常大的表,
表格大致是这样的:

 CREATE TABLE `big_table` (
   `id` BIGINT(11) NOT NULL AUTO_INCREMENT,
   `main_id` INT(11) DEFAULT NULL,
   `key` VARCHAR(20) NOT NULL,
   PRIMARY KEY (`id`),
   KEY `main_id_key` (`main_id`,`key`),
 ) ENGINE=INNODB AUTO_INCREMENT=2315678197 DEFAULT CHARSET=utf8

我需要将 main_id + keys 的所有唯一值放入一个新表中。
使用以下查询需要花费大量时间(在非常快的服务器上 3 天后仍在运行):

 CREATE TABLE `get_unique` (
   `main_id` int(11) NOT NULL,
   `key` varchar(20) NOT NULL,
   PRIMARY KEY (`main_id`,`key`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 INSERT IGNORE INTO get_unique 
 SELECT main_id,key FROM big_table

所以我的问题是 -
这会更快吗?

 CREATE TABLE `get_unique` (
   `main_id` int(11) NOT NULL,
   `key` varchar(20) NOT NULL,
   PRIMARY KEY (`main_id`,`key`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 INSERT INTO get_unique 
 SELECT main_id,key FROM big_table
 GROUP BY 1,2

最佳答案

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

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

关于mysql - GROUP BY 与 INSERT IGNORE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12365142/

相关文章:

python - 从 MySQL 写入文件时出现内存问题

php - 与我的 PHP 网站一起实现 node.js 和 socket.io

php - Magento - 如何从 MySQL 表中获取数据并创建自定义选择菜单

python - 当两个用户同时输入时SQL会覆盖数据(Python)

MYSQL获取组数

php - 不断收到警告 : mysql_fetch_object(): supplied argument is not a valid MySQL result resource

sql - 在 SQL 中,如果可用,如何获取具有特定列值的行,否则获取任何其他行

php - 2 个表中的条件,但仅从一张表中选择

MYSQL 在不切断中间字的情况下修剪字符串

php - 使用 PHP 和 MySQL 通过比较逗号分隔的字符串列值从表中获取值