質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

2286閲覧

大量データのCSV読み込みについて

test_87097

総合スコア45

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2019/08/28 06:14

編集2019/08/28 06:27

使用するテーブル

SQL

1CREATE TABLE IF NOT EXISTS `serials` ( 2 `id` int(11) NOT NULL auto_increment, 3 `number` char(12) BINARY NOT NULL, 4 PRIMARY KEY (`id`), 5 UNIQUE KEY `number` (`number`), 6 INDEX (`number`) 7) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

行いたいこと

大量にあるCSVデータを格納したい。

1ファイル150万件のシリアルナンバーが書いてあるデータを
LOAD DATA LOCAL INFILE "ファイル名.csv" INTO TABLE DB名.serials FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' (number);
これを30回繰り返して計4500万のシリアルデータを格納したいが5回ほど作業を行うとだんだん作業が遅くなり、15回目にSQLの通信が切れた。

疑問点
既にデータがある状態でCSVを読み込んで格納しようとすると動作が重たくなってしまうのか?現状の不具合の解消方法として
もっとファイルを細かくするしかないと思うがそれ以外に方法はあるか?

よろしくお願いします。

SQL

1DROP TABLE IF EXISTS `serials`; 2CREATE TABLE IF NOT EXISTS `serials` ( 3 `id` int(11) NOT NULL auto_increment, 4 `number` char(12) BINARY NOT NULL, 5 PRIMARY KEY (`id`, `number`) 6) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

このようにPRIMARY KEYを複数設定することでcsvデータを入れ込む際の
時間はぐっと減ったのですが、これはこれでいいのか不安です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/08/28 06:19

>これを30回繰り返して 処理を一度に行っているということでしょうか
test_87097

2019/08/28 06:24

30回繰り返していますので、処理と一度におこなっているわけではないです。
test_87097

2019/08/28 06:24

ファイル名は繰り返すたびに変更しています。
guest

回答3

0

150万件がすんなり行くならパーティショニングが有効かもしれません

投稿2019/08/28 06:17

yambejp

総合スコア114572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

test_87097

2019/08/28 06:25

それはどのように設定を行えば良いのでしょうか?
guest

0

・せめてファイル単位にCOMMITする。
但し、MySQL 5.1.12 より前のバージョンでは、LOAD DATA INFILE は、勝手に暗黙的なコミットを行うようなので、バージョン次第。

投稿2019/08/28 06:57

編集2019/08/28 07:08
sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

インフラエンジニアの観点から

だんだん作業が遅くなり

このときDBサーバのリソースが原因であるかどうか確認しましょう。メモリを食いつぶしていないか。CPUが高負荷になっていないか。DiskIOが高負荷になっていないか。

SQLの通信が切れた

切れた原因は不明でしょうか。DBサーバがハングアップして切れた?処理に時間がかかりすぎてタイムアウトになった?

DBサーバが高負荷になっていることが原因と考えられるなら、
・ファイルを細かくする
・DBサーバのリソースをモニタリングしながら、CSVを読み込ませる
などでしょう

投稿2019/08/28 06:44

yukky1201

総合スコア2751

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

test_87097

2019/08/28 06:48

切れた原因はタイムアウトです。 やはりファイルを細かくするのが一番有効でしょうか?
yukky1201

2019/08/28 07:01

ファイル細かくするのも面倒ですので 私だったらDBサーバのリソース見つつ、CSV読み込ませます。 もしくは、バッチとかシェルで30分に1ファイルずつ読み込ませるとか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問