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

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

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

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

MySQL

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

Q&A

1回答

556閲覧

複数サーバーの同時insert処理の高速化

T_retasu

総合スコア13

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

MySQL

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

0グッド

0クリップ

投稿2020/08/06 16:10

編集2020/08/07 03:06

[構成]
dbサーバー1台
上記サーバーにinsertするサーバー10台(仮)

[疑問点]
複数のサーバーが一台のDBサーバーに同時に複数のレコードをinsertをし続ける時(実際は多くてもinsertサーバーAが30インスタンス、insertサーバーBが5インスタンス、insertサーバーcが2インスタンス同時にinsertになる事もあるくらいなのですが)どうすれば早く処理ができるのかを教えて頂きたく質問をさせて頂きました。
insertサーバーは他のinsertサーバーの書き込む内容には一切依存はありません。

・DBサーバーのメモリーかCPU(どちら?)をあげる
・forではなく一度のクエリでまとめてinsertする
・rollback、commit処理不要?
・DBにinsertするサーバーのdb接続をしっぱなしにし一定時間ごとに接続し直す?
・一つのinsertサーバーがDBサーバーに接続をしている時他のinsertサーバーは待っているの感じがするので、待たずに同時に書き込む?ようにmysqlの設定を変える

あたりが思い浮かんだのですがどのようにすれば良いものなのでしょうか?

(mysqlにinsertするサーバー) package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" ) //table type humans struct { age int name string } func hoge(){ all_recode := []humans{humans{32,"花子"},humans{52,"イチロー"},humans{12,"敬浩"}} db, _ := sql.Open("mysql", "ユーザ名パスワードipアドレス等") defer db.Close() tx, _ := db.Begin() defer tx.Rollback() stmt, _ := tx.Prepare("INSERT INTO humans (age, name) VALUES (?, ?) defer stmt.Close() for _, one_recode := range all_recode { _, err := stmt.Exec(one_recode.age, one_recode.name) if err != nil { fmt.Println(err) } } err2 := tx.Commit() if err2 != nil { fmt.Println(err2) } } func main(){ for{ hoge() } }

goバージョン1.14
mysqlバージョン8

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

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

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

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

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

guest

回答1

0

・forではなく一度のクエリでまとめてinsertする

です。
要件によってはバルクインサート が使えたり、 insert ... select ... 1回で済むとかもあります。

投稿2020/08/06 18:14

Orlofsky

総合スコア16417

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

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

Orlofsky

2020/08/07 03:47

パフォーマンス・チューニングの観点からすると、正常に動作するなら早い方が正解になります。正解は1つとは限りません。T_retasu さんがご自分できちんと動作確認して、納得がいく方法を選んでください。 >複数のサーバーが一台のDBサーバーに同時に複数のレコードをinsertをし続ける時 一度にinsertする件数や何分毎のような時間の間隔も明示できた方が良いです。ハードウェアにお金をかけて大きなサーバーに統合した方が良い時もあります。
Orlofsky

2020/08/07 05:14

insert ... select ... 1回で済ませるのが最速だとは思います。
T_retasu

2020/08/07 14:27

ありがとうございます 他のサーバーのコネクト、クローズを待たず同時にコネクトし書き込むのような事はできないのでしょうか? まとめてのインサート以外に大きく早くなりそうな感じのやり方はございますでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問