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

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回答

4064閲覧

sqlのunionについて

makibi5577

総合スコア112

MySQL

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

SQL

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

0グッド

2クリップ

投稿2016/01/23 15:19

編集2022/01/12 10:55

mysqlでunionを利用して、selectを12回繋げたsqlを書きました。

これは1文で書いていますが、12回接続されていることになるのでしょうか?
unionのパフォーマンスについて教えていただけると助かります。


ここから追記、修正

回答ありがとうございます。
聞き方を間違いていたのと、質問の仕方が雑でした。
申し訳ありません。

速度ではなく、unionで連結した場合のDBへの負荷が知りたいです。

例えば、下記のようにA~GテーブルをUNIONで連結して、1度で問い合わせした場合と
A~Gをselectを7回繰り返した場合とで、DBへの負荷に違いはあるのでしょうか?

sql

1SELECT contents 2FROM 3( 4SELECT title as contents FROM A 5UNION 6SELECT name as contents FROM B 7UNION 8SELECT name as contents FROM C 9UNION 10SELECT name as contents FROM D 11UNION 12SELECT name as contents FROM E 13UNION 14SELECT name as contents FROM F 15UNION 16SELECT name as contents FROM G 17) as M 18WHERE contents LIKE '%var%'

sql

1SELECT title FROM A WHERE title LIKE '%var%'; 2SELECT name FROM B WHERE name LIKE '%var%'; 3SELECT name FROM C WHERE name LIKE '%var%'; 4SELECT name FROM D WHERE name LIKE '%var%'; 5SELECT name FROM E WHERE name LIKE '%var%'; 6SELECT name FROM F WHERE name LIKE '%var%'; 7SELECT name FROM G WHERE name LIKE '%var%';

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

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

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

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

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

guest

回答3

0

検証してみました。

[検証手順]
テーブルA, B, Cを作成。
テーブルA.title B.name C.nameにランダムな10文字の文字列を100レコード挿入。
この100レコードをベースに102,400レコードに複製。
クライアントとDBと別の端末でSQLを3回実行した平均時間を計測。
前者のSQLを(1)、後者のSQLを(2)とします。
なお、UNIONで結合すると内部的にソートと重複の削除がされます。
そのため厳密には前者と後者のSQLの結果が異なる場合があります。
また前者のSQLで各SQLにWHERE条件を指定せずに結合結果に対して
絞り込みを実施しているためレスポンス的に問題があると思いました。
そのため検証パターンに(3)UNION ALLに変えたものと
(4)UNION ALLに変え各SQLにWHERE条件を付け加えたものを追加しました。

[検証結果]
(1)前者:UNIONで結合した場合・・・0.359 sec (8 rows)
(2)後者:単一のSQLを連続実行した場合・・・0.208 sec (8,192 rows)
(3)UNION ALLで結合した結果・・・0.370 sec (8,192 rows)
(4)各SQLにWHERE条件を追加しUNION ALLで結合した結果・・・0.198 sec (8,192 rows)

まったく同じ結果を求めるのであれば比較すべきは(2)と(4)だと思いますが、
レスポンス時間的にほとんど大差はありません。
実行側がSQL実行のたびに接続と切断を繰り返すのであれば、
まとめて取得する(4)に軍配が上がるのではないかと思います。
一方で接続したまま繰り返し実行するのであれば
どちらも大差がない(誤差の範囲)と言えると思います。

SQL

1--(1)のSQL 2SELECT contents 3FROM 4( 5 SELECT title as contents FROM A 6 UNION 7 SELECT name as contents FROM B 8 UNION 9 SELECT name as contents FROM C 10) as M 11WHERE contents LIKE '%ab%'; 12 13--(2)のSQL 14SELECT title FROM A WHERE title LIKE '%ab%'; 15SELECT name FROM B WHERE name LIKE '%ab%'; 16SELECT name FROM C WHERE name LIKE '%ab%'; 17 18--(3)のSQL 19SELECT contents 20FROM 21( 22 SELECT title as contents FROM A 23 UNION ALL 24 SELECT name as contents FROM B 25 UNION ALL 26 SELECT name as contents FROM C 27) as M 28WHERE contents LIKE '%ab%'; 29 30--(4)のSQL 31SELECT contents 32FROM 33( 34 SELECT title as contents FROM A WHERE title LIKE '%ab%' 35 UNION ALL 36 SELECT name as contents FROM B WHERE name LIKE '%ab%' 37 UNION ALL 38 SELECT name as contents FROM C WHERE name LIKE '%ab%' 39) as M;

投稿2016/02/14 09:05

nabe3

総合スコア345

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

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

0

これは1文で書いていますが...

エスパーじゃないので例示が無ければ???です

クエリのパフォーマンスを語るなら、まずMySQL Workbenchでなどで必ず実行計画を確認する癖を付けましょう

投稿2016/01/23 20:37

dojikko

総合スコア3939

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

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

0

mysqlは使ったことないのですが、計測してみるとよいと思います。

unionを使った場合、分割して12回連続でsqlを発行した場合、接続をやり直すかどうかは、読み込み側のシステムによって違いますが、パフォーマンスについてが問題なら、やってみれば一目瞭然です。読み込み結果は解釈せずにsqlの発行だけであれば手間もかからないはずです。


追記に対する回答です。

上記のUnionクエリの場合はA〜Gまでの各テーブルの全行をくっつけてから、絞っているのでDBによってはかなりの負荷がかかると思われます。逆に1つづつSelect発行した時のように各Select句にWhere句を追加した場合はほぼおなじ負荷になることが予想されます。

ただし、DBのオプティマイザが賢く各SelectにWhere句を追加する場合もあるので、なんともいえませんが。。。

投稿2016/01/24 05:33

編集2016/02/14 09:53
iwamoto_takaaki

総合スコア2883

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問