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

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

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

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

並列処理

複数の計算が同時に実行される手法

Q&A

1回答

4920閲覧

MySQLクエリ(SELECT文)の並列処理が実現できません

y_kato

総合スコア0

MySQL

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

並列処理

複数の計算が同時に実行される手法

0グッド

0クリップ

投稿2020/10/02 06:29

編集2020/10/02 07:04

前提・実現したいこと

MySQLにて、同一クエリを同時に発行した場合、それぞれのクエリを並列に処理したいです

環境:MySQL 5.7.25(Docker)
トランザクション:REPEATABLE READ(デフォルト)

例:実行に2秒かかる遅めのクエリがあります(集計系のクエリを想定しています)
クエリ:サブクエリを含んだSELECT文(FOR UPDATEなどのロックに関する処理はありません)

前提:上記のクエリを別のクライアントAとBから同時に1つずつ(計2つ)発行します

理想:AとBのクライアントにそれぞれ2秒でレスポンスを返したいです

問題(現状):AとBのクライアントにはそれぞれ約4秒でレスポンスが返ってきます

参考:別のリソースを参照する異なるクエリを同時に発行した場合では、意図した並列処理の実行時間でレスポンスが得られました。

詳細

同一クエリを同時に2つ発行すると単体で実行した場合と比較して、倍近くの時間がかかってしまいます。
まるで直列に実行したような挙動になってしまいます。
推測ですが、同一クエリで同じリソースを参照しているために、ロックがかかってしまい、結果として直列処理のような挙動になってしまっていると思われます。
MySQLのロックやトランザクションについて、いくつか調査をしましたが、上記に関連するような記述は見つけられませんでした。
また、MySQLでは特別な設定はしておらず、全てデフォルトの設定です。

上記現象に関して、どなたか知見がございましたら、助言をお願いできませんでしょうか。
よろしくお願いします。

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

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

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

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

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

hihijiji

2020/10/02 07:26 編集

ボトルネックがある場合は、並列処理とかロックとか関係なしにクエリの数だけ時間がかかります。 集計系のクエリならストレージかも? 対策としてはパーティショニングかストレージ強化かな?
y_kato

2020/10/02 07:51

ご回答ありがとうございます。 いくつかの環境で検証しておりますが、GCPの環境下では、CPU使用率10%、ストレージ使用量20%、メモリ使用量60%といった状況です。 マシンタイプはdb-n1-standard-1です。 ご参考までに記載させていただきました。
y_kato

2020/10/02 08:13

ありがとうございます。 参考にさせていただきます。
guest

回答1

0

コア単位でスレッドがわかれるので同時実行は可能だったと記憶していますが
トランザクションでテーブルロックするような処理がはいっているなら
終わるのを待つ可能性はあるでしょう。

投稿2020/10/02 06:38

yambejp

総合スコア116724

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

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

yambejp

2020/10/02 06:40

パフォーマンスの問題というよりは運用上の問題かと。 どういった処理をなさっているかわかりませんが 集計が遅い処理は適当な単位でなんらかのサマリーテーブルに 保持させるとかで回避した方がよいかも
y_kato

2020/10/02 06:55

早速のご回答ありがとうございます。 テーブルロックをするようなクエリは発行しておりません。 もし、お時間をいただけるようでしたら、クエリや実行計画、MySQLの設定などの追加情報を記載させていただきます。 集計処理に関してはサマリーテーブルの作成を検討してみます。 ただ、検索処理につきましてはリアルタイムでの実行を想定しています。 その場合に、数十の同時アクセスがある環境下では同様の問題が発生するので、解決したく考えております。 クエリの実行時間を短くすることは必須と承知していますが、同一クエリを並列に処理する方法(設定など)をご存知でしたらご教授お願いします。
y_kato

2020/10/02 06:58

追加の質問です。 そもそもですが、MySQLのデフォルトの挙動として、同一のクエリを同時に発行した場合には直列実行になるのでしょうか。
yambejp

2020/10/02 07:04 編集

たとえば start TRANSACTION; select sleep(10); commit; を実行させてから、並行して select 1; を実行しても、上記を待たずすぐに1が返ってきます
yambejp

2020/10/02 07:07 編集

並行処理ができない再現性のあるSQL文があれば検証するのですが・・・ 理論的にその他で考えられるのはマルチコアではないCPUとか 全コアがふさがっているとか・・・であれば当然コア単位で 並行処理は無理です(ちょっと考えづらいですけど)
y_kato

2020/10/02 07:24

分かりやすい具体例のご提示ありがとうございます。 追加情報で書かせていただきましたが、別のリソースを参照するクエリについては、意図した並列実行ができております(ご提示いただいた例と同様の結果です)。 このような結果からも、リソースのロックが発生しているのではないかと推測しています。 肝と考えておりますのは、同一のリソースを参照するクエリ(≒同一クエリ)を同時に発行した場合の並列処理についてでございます。
y_kato

2020/10/02 07:26

実際のデータも必要になりますので、再現性のあるSQL文のご提示は厳しそうです。。。
yambejp

2020/10/02 07:37

まさかとは思いますがテーブルエンジンがMyISAMとかだと テーブルロックの可能性はあります 普通にやっていればInnoDBですよね?
y_kato

2020/10/02 07:43

はい、InnoDBです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問