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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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回答

904閲覧

MySQLにテキストファイルやCSVで保存された1億ほどのデータをINSERTしたい

KohnoseLami

総合スコア17

MySQL

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

SQL

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

0グッド

1クリップ

投稿2023/01/07 15:09

前提

現在特殊な方法で集められたデータが手元に存在しておりそれらが1行ずつデータで存在しており、データの問い合わせやAPI化を検討しているためMySQLに移動させて利便性を上げたいのですがいまいち大規模データをMySQLにインサートする方法が思い浮かびません

実現したいこと

Python, Node.JS(Deno)などでファイルをストリームで1行ずつ読み込みながらそれをどんどんインサートしていく感じで作成していますがもちろん遅すぎて終わる気がしないため何か別言語やテキストファイルの内容をSQL文やCSV形式に整形してインポートが出来るなら整形できるため現時点では一番現実的かなと思っています

発生している問題・エラーメッセージ

1行ずつのINSERT処理だと遅すぎる

試したこと

現在はNode.JSにてreadlineを使用して1ラインずつ読み込み、Sequelizeを使いINSERTをしてみましたがあまりにも遅すぎました

補足情報(FW/ツールのバージョンなど)

MySQL (バージョンは未定、パフォーマンスが良い物を採用)

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

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

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

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

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

guest

回答3

0

LOAD DATA INFILEを使ってはどうでしょう

投稿2023/01/07 15:29

a.com

総合スコア871

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

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

KohnoseLami

2023/01/07 15:35

CSVなどのローカルファイルからインポートする機能がやはりあるのですね 今から試してみます
guest

0

遅いものは仕方ないので、普通は バックグラウンド処理にして、非同期に処理するのが定石です。

投稿2023/01/07 15:25

編集2023/01/07 15:27
phper.k

総合スコア3923

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

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

KohnoseLami

2023/01/07 15:38

1000rows / 1secs で1億の場合は約30時間ほどですかね おそらく自分の手間を考えれば単純に非同期的にインサートをするのがやはり一番全体で見れば手っ取り早い方法なのですかね、、、
guest

0

ベストアンサー

バルクインサート (まとめてインサート) である程度の件数ごとに INSERTしてはいかがでしょう

例:

INSERT INTO table_name (col_1, col_2, col_3) VALUES (1, 2, 3), (4, 5, 6), (7, 8, 9);

投稿2023/01/07 15:25

yuma.inaura

総合スコア1453

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

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

KohnoseLami

2023/01/07 15:41

1億はほぼファイル分けがされておらず1ファイル当たり6GB~30GBほどあるため全てをメモリに格納するのは難しく私の考える限りでは数件ごとに分けるには同期処理を行って、Streamで読み込みながらArrayに格納していき1000件程度になったら裏でBulkInsertを行ってるうちにまた次の1000件を用意するという流れしか思いつかずその場合逆に遅くなってしまうのかと思いまだ試せていません やはりBulkInsertが有効なのでしょうか?
yuma.inaura

2023/01/07 15:50

SQLの発行は重さのボトルネックになりやすいので発行回数を減らせればと思いましたが、試してみないとなんともです
KohnoseLami

2023/01/07 16:18

ありがとうございます、現在1ラインずつStreamで読み込みArrayが1000件以上になった場合にBulkInsert→Arrayをクリアを繰り返しでとても高速にインサートが出来ました 数十秒で1,000,000件近くに到達しておりおそらく一番確実で実装が簡単であり高速なためベストアンサーにさせていただきます! やはり推測であまり変わらなそうといって試さないのは良くないですね、勉強になりました。 ありがとうございました
yuma.inaura

2023/01/08 03:39

すごい速度の違いですね 笑 解決して良かったです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問