38
34

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-06-14

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 ドメインソケットなら特に違いは無かった。

38
34
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
38
34

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?