2017-06-28 6 views
0

私はMySQL v5.6を使用しています。データ読み込み後のインデックス作成InFile

新しく作成したテーブル(InnoDB)に約10百万行を挿入します。私は、 "Load Data InFile"と複数の挿入の間でこれを行う最善の方法を選択しようとしています。

は、LOAD DATA INFILEはなる(とある)、より効率的に、私は奇妙なことを観察していなければならない:インデックス作成がはるかに長い「は、LOAD DATA INFILE」を使用した場合(15%)である...

それを観察する

ステップ(以前はすべて完了したとき、各ステップが始まる):

  1. 私は新しいテーブル(のtable_1)
  2. を作成し、私は新しいテーブル(table_2)
  3. を作成し、私は10万行を挿入複数の挿入を持つtable_1(バッチ5,000)
  4. 私は私がtable_2に(ALTER TABLEで)一度に4つのインデックスを作成するのtable_1
  5. に(ALTER TABLEで)一度に4つの索引を作成
  6. INFILE負荷データとtable_2で10万行を挿入 - について>前のステップよりも15%長くなりました。

これは何が説明できるのでしょうか?

(もちろん、結果は注文の手順と同じです2、1、4、3、6、5)

+0

良いです。ステップの順序を変更するなどして、いくつかの変数を削除しました。その他の質問:レコードは同じ順序ですか? 'PRIMARY KEY'はすでに確立されていましたか? 'AUTO_INCREMENT'または自然? Naturalの場合は、順番にレコードがありますか? 4つのADD INDEX句を持つ1つのALTER? –

答えて

0

それはINSERTとデータの負荷がより多くのデータ・ページが生じ占める残っている可能性がありますバッファプール。 LOAD DATAを使用した表に索引を作成するときは、最初にディスクからバッファー・プールにページをロードしてから、その中にデータを索引付けする必要がありました。

あなたがデータをロードした後に照会することによってこれをテストすることができます

SELECT table_name, index_name, COUNT(*) 
FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE 
WHERE table_name IN ('`mydatabase`.`table_1`', '`mydatabase`.`table_2`') 
GROUP BY table_name, index_name; 

次に、あなたがあなたの索引を作成した後、再びこれを行います。

(もちろん、あなたがこれらのテーブルを作成するデータベースの名前でmydatabaseを交換してください。)

+0

これは本当に理由があります!ただし、INFORMATION_SCHEMAにINNODB_BUFFER_POOLは存在しないようです。スペルを間違えましたか? Ref:https://dev.mysql.com/doc/refman/5.7/en/innodb-i_s-tables.html – Nicolas

+0

申し訳ありません。はい、間違って入力しました。それは本当にINNODB_BUFFER_PAGEです。私はこれを修正するために上記を編集します。 –

+1

詳細については、平均、データ(max)(data_size)、インデックス名FROMとして 'SELECT count(*)、sum(number_records)を行、sum(data_size)、min(data_size)、round(avg(data_size) GROUP BY index_name; ' –

関連する問題