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

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

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

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

Q&A

解決済

2回答

253閲覧

Mysqlの抽出(select)時間の早い書き方を教えて下さい。

behoimi80

総合スコア62

MySQL

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

0グッド

1クリップ

投稿2018/01/15 10:34

編集2018/01/16 00:32

下記のようなSQLを作りました。

SELECT TBL_A.A1 , ( SELECT COUNT(Y) FROM TBL_Y WHERE TBL_Y.A1 = TBL_A.A1 AND TBL_Y.Y1 = ( SELECT Z FROM TBL_Z WHERE TBL_Z.A1 = TBL_A.A1 AND TBL_Z.Z1 = TRUE ) AND ) AS Y_SUM from TBL_A, TBL_B Where TBL_A.A1 = TBL_B.A1

TBL_A は4件
TBL_B は6万件
TBL_Y は145万件
TBL_Z は2.5万件
あります。

単純にTBL_AのA1に一致するTBL_Yの合計値を抽出したいだけです。
ただ、TBL_YのデータははTBL_ZのZ1がTRUEに限ります。

上記Sqlを実行すると約20秒ほどかかり、困っています。
抽出時間が早い書き方はありますか?

宜しくお願い致します。

-----------追加-------------------
EXPLAINの結果
|id|select_type|table|type|possible_keys|key|ref|Extra|
|1|PRIMARY|TBL_A |index |PRIMARY|PRIMARY|(null)|Using where; Using index|
|1|PRIMARY|TBL_B |eq_ref |PRIMARY|PRIMARY|TBL_A.A1|Using index|
|2|DEPENDENT SUBQUERY|TBL_Y |ref |PRIMARY,MUK_IDX2|MUK_IDX2|TBL_A.A1|Using where|
|3|DEPENDENT SUBQUERY|TBL_Z |ALL |(null)|(null)|(null)|Using where|

A1はint(8)型で、TBL_BのA1はプライマリーキーで重複・NULLはありません。
TBL_A,TBL_Y,TBL_ZはNULLはありませんが、重複はあります。

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

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

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

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

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

maisumakun

2018/01/15 10:46

まず、インデックスを含めたテーブル定義とEXPLAINの結果をご提示いただければと思います。
yambejp

2018/01/15 11:03

A,B,Y,Zの具体的なサンプルが必要です。また各テーブルにおけるA1はユニークデータなのでしょうか?またZ1はNULLを排除したデータになっていますか?
behoimi80

2018/01/16 00:34

maisumakun様、 yambejp様、返信ありがとうございます。インデックスを含めると早いやEXPLAINを初めて知りました。分かる情報を追加しました。自分でももう少し調べてみます。また、アドバイスがあれば宜しくお願い致します。
guest

回答2

0

TBL_ZALLとなっていて、ここがフルテーブルスキャンとなっているのがまず気になるところです。

TBL_Z.ZがPrimary Keyなら、それを活かすためにTBL_Y.Y1にインデックスを付けて、TBL_Y INNER JOIN TBL_Z ON TBL_Y.Y1 = TBL_Z.Zのようにして絞り込むほうが自然な形ではないかと思います。

WHERE TBL_Z.A1 = TBL_A.A1という条件がありますが、TBL_Z.A1にある値はTBL_A.A1の4つの値のどれか、というのは間違いないでしょうか)

投稿2018/01/16 01:01

maisumakun

総合スコア145183

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

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

0

ベストアンサー

素直にこれで良いと思います。あと質問の条件ではテーブルBにふれていませんが、存在確認が必要ということで良いですか?

bash

1SELECT 2 A.A1 3 ,COUNT(TBL_Y.A1) 4FROM 5 TBL_A A INNER JOIN TBL_B B ON 6 A.A1 = B.A1 7 INNER JOIN TBL_Y Y ON 8 A.A1 = Y.A1 9 INNER JOIN TBL_Z Z ON 10 Y.A1 = Z.A1 11WHERE 12 Z.Z1 = TRUE 13GROUP BY 14 A.A1

投稿2018/01/16 00:57

編集2018/01/16 01:13
hichon

総合スコア5737

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

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

hichon

2018/01/16 01:14

GROUP BYが抜けていたので訂正。
behoimi80

2018/01/17 06:16

hichon様、返信ありがとうございます! 凄く早く抽出出来ました! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問