MySQL に大量のデータを手っ取り早く挿入する

  • 39
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

LOAD DATA にパイプからデータを流し込みます。

まずはデータを入れるテーブルを作ります。

create table t (
  id int not null primary key,
  str text not null
);

LOAD DATA には計算式をかますことができるので RAND() のような関数も使うことができます。

LOAD DATA にはファイル名しか指定できませんが /dev/stdin とでもすれば標準入力から流しこむことができます。

seq 10000000 |
  mysql test -e "
    load data local infile '/dev/stdin' into table t (id)
    set str = floor(rand()*10000000)
  "

LOAD DATA LOCAL INFILE ではなく LOAD DATA INFILE を使いたければ mkfifo を使うと良いです。
mysqld から読めるように -m 0644 も指定しておきましょう。

mkfifo -m 0644 /tmp/xxxx
seq 10000000 > /tmp/xxxx &
mysql test -e "
  load data infile '/tmp/xxxx' into table t (id)
  set str = floor(rand()*10000000)
"
rm /tmp/xxxx

環境や流し込むデータの内容によってかかる時間は全然違うと思いますが、1000 万件が 1 分強ぐらいでした。


LOAD DATA LOCAL INFILE よりも LOAD DATA INFILE の方が速いかなと思ったけど接続が Unix ドメインソケットなら特に違いは無かった。