5


やあ!
mysql (5.1) で非常に大きなテーブルをスキャンする必要があります。
これは、テーブルが多かれ少なかれどのように見えるかです。

CREATE TABLE `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`),
 ) ENGINE=INNODB AUTO_INCREMENT=2315678197 DEFAULT CHARSET=utf8

main_id + キーのすべての一意の値を新しいテーブルに取得する必要があります。
次のクエリを使用すると、多くの時間がかかります (非常に高速なサーバーで 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
4

1 に答える 1

4

はいGROUP BY main_id, keyは、と比較して何倍も高速に実行されINSERT IGNOREます。

SELECT.. GROUP BY main_id, keyカバーリングインデックスを利用することで実行が速くなり、レコード数が少なくなりますが、挿入されるすべての行のルックアップINSERT IGNOREが必要になります。INDEX KEY

于 2012-09-11T07:57:58.780 に答える