らっちゃいブログ

日々の学びと気づきを発信するブログ

MySQL の LOAD DATA INFILE ステートメントが爆速だった話

スポンサーリンク

こんにちは。racchai です。

先日、巨大な CSV ファイルを mysql にインポートしたいんだけどっていう相談を受けまして

まあデータ入れるだけだしと思って深く考えずに引き受けたわけです。

で、さくっと書いたプログラムがどうも1日かかっても終わらない。。

仕方ないのでバルクインサートするように書き換えてみたものの、やっぱり半日くらいかかっちゃう。

「これデータがでか過ぎるんだよね」とか自分のせいじゃないよアピールをしてみたものの、このままでは恥ずかし過ぎる。。

ということで詳しい人に相談してみたところ

「LOAD DATA INFILE 試した?」

って返ってきた。

「あーはいはい、LOAD DATA INFILE ね。知ってた知ってたーそういやまだだったわー忘れてたわー」

地獄のミサワ風に知らなかったことを誤魔化し、帰宅後光の速さでググりました。

どうやらプログラム書く必要すらなくて mysql のクエリ内で CSV ファイルを直接指定してロード可能という素敵ステートメントがあるらしい。

で、mysql のマニュアルを見つつ以下のようなクエリを組み立てて軽い気持ちで叩いてみたわけです。

mysql> LOAD DATA LOCAL INFILE /tmp/bigdata.csv INTO TABLE bigdata CHARACTER SET UTF8 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 LINES (column1, column2);

一応クエリの解説しておくと、改行コードが\n/tmp/bigdata.csv という CSV ファイルを先頭行を無視して bigdata テーブルにロードするってことをしてます。

どうせ明日までかかるだろうと思って風呂に入り、出てきたところで画面を見たら・・・

なんじゃこりゃあ!終わってるやないか!

なんと5分弱で終了してました。速い。速すぎる!

いままでこんな便利な機能を知らなかったのかと、己の無知を恥じました。

データがでかすぎるんだよとか言ってごめんなさい。もっと勉強します。

実践ハイパフォーマンスMySQL 第3版

実践ハイパフォーマンスMySQL 第3版