1

約50M行とフォーマットのテーブルがあります:

CREATE TABLE `big_table` (
  `id` BIGINT NOT NULL,
  `t1` DATETIME NOT NULL,
  `a` BIGINT NOT NULL,
  `type` VARCHAR(10) NOT NULL,
  `b` BIGINT NOT NULL,
  `is_c` BOOLEAN NOT NULL,
  PRIMARY KEY (`id`),
  INDEX `a_b_index` (a,b)
) ENGINE=InnoDB;

t2次に、インデックスなしでtable を定義します。

Create table `t2` (
  `id` BIGINT NOT NULL,
  `a` BIGINT NOT NULL,
  `b` BIGINT NOT NULL,
  `t1min` DATETIME NOT NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

次にt2、クエリを使用して入力しますbig_table(これにより、約 12M 行が追加されます)。

insert into opportunities
  (id, a,b,t1min)
  SELECT id,a,b,min(t1)
    FROM big_table use index (a_b_index)
    where type='SUBMIT' and is_c=1
   GROUP BY a,b;

このクエリで 5000 個の個別のデータを処理するのに約 1 分かかることがわかり(a,b)ましたbig_table
には 12M の個別があるため(a,b)big_tableすべての でクエリを実行するには約 40 時間かかりますbig_table

何がうまくいかないのですか?

私がそうSELECT ...すると、クエリは約 2 秒で 5000 行を実行します。ISELECT ... INTO OUTFILE ...の場合、クエリは 5000 行で 60 秒かかります。

EXPLAIN SELECT ...与えます:

id,select_type,table,type,possible_keys,key,key_len,ref,rows,Extra
1,SIMPLE,stdnt_intctn_t,index,NULL,a_b_index,16,NULL,46214255,"Using where"
4

2 に答える 2

1

GROUP_BYのランダムアクセス読み取りが多すぎることが問題であることがわかりましたbig_table。次の戦略では、 を 1 回連続して通過できますbig_table。まず、次のキーを追加しますt2

Create table `t2` (
  `id` BIGINT NOT NULL,
  `a` BIGINT NOT NULL,
  `b` BIGINT NOT NULL,
  `t1min` DATETIME NOT NULL,
  PRIMARY KEY (a,b),
  INDEX `id` (id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

t2次に、次を使用して埋めます。

insert into t2
  (id, a,b,t1min)
  SELECT id,a,b,t1
    FROM big_table
    where type='SUBMIT' and is_c=1
 ON DUPLICATE KEY UPDATE 
   t1min=if(t1<t1min,t1,t1min),
   id=if(t1<t1min,big_table.id,t2.id);

その結果、速度が数桁向上します。

于 2013-03-08T06:55:39.593 に答える
0

groupbyが問題の一部である可能性があります。(a、b)のインデックスを使用していますが、whereは使用されていません。私はインデックスを持っているでしょう

(type、is_c、a、b)

また、「ID」を取得していますが、どちらを指定していません...一貫した結果を得るためにMIN(ID)を実行する可能性があります。

于 2013-03-04T20:40:28.123 に答える