Windows2008 Hyper-VゲストOS上にWindows2008 + MySQL5.5にてDB環境を構築しています。
そのMySQL環境にて下記2つのテーブルからviewテーブルを構築しています。
○テーブル1(1,000行)
CREATE TABLE `testdb`.`mst` (
`KBN` char(10) COLLATE cp932_bin NOT NULL,
`NM` char(48) COLLATE cp932_bin DEFAULT NULL,
`MSTDATE` int(10) DEFAULT NULL,
PRIMARY KEY (`KBN`),
KEY `idx_bookkbn_spdate` (`DATE`)
) ENGINE=InnoDB DEFAULT CHARSET=cp932 COLLATE=cp932_bin;
○テーブル2(145,000行)
CREATE TABLE `testdb`.`dt` (
`KEYID` int(10) NOT NULL,
`KBN` char(10) COLLATE cp932_bin NOT NULL,
`MEMO` varchar(1024) COLLATE cp932_bin DEFAULT NULL,
`SUBC01` char(128) COLLATE cp932_bin DEFAULT NULL,
`SUBC02` char(128) COLLATE cp932_bin DEFAULT NULL,
`SUBN01` int(10) DEFAULT NULL,
`SUBN02` int(10) DEFAULT NULL,
PRIMARY KEY (`KEYID`,`KBN`),
KEY `idx_dt_keyid` (`KEYID`),
) ENGINE=InnoDB DEFAULT CHARSET=cp932 COLLATE=cp932_bin;
○view
CREATE OR REPLACE ALGORITHM=UNDEFINED DEFINER=`test`@`%` SQL SECURITY DEFINER VIEW `viewdtmst` AS
select distinct
`dt`.`KEYID` AS KEYID,
`dt`.`KBN` AS KBN,
`dt`.`MEMO` AS MEMO,
`dt`.`SUBC01` AS SUBC01,
`dt`.`SUBC02` AS SUBC02,
`dt`.`SUBN01` AS SUBN01,
`dt`.`SUBN02` AS SUBN02,
`mst`.`NM` AS NM,
`mst`.`MSTDATE` AS MSTDATE,
from (`dt` left join `kmst` on((`dt`.`KBN` = `mst`.`KBN`)));
■ここからご相談となります。
上記viewdtmstに対して下記の様なクエリーを実行すると
処理時間が12.5426sとかなり時間がかかり改善したいと考えています。
--------------------------------------------------------------
検索クエリー
--------------------------------------------------------------
SELECT * FROM viewdtmst
WHERE KEYID = 10010
ORDER BY KEYID,MSTDATE DESC,KBN;
--------------------------------------------------------------
上記クエリーのexplain結果
--------------------------------------------------------------
id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
1, 'PRIMARY', '<derived2>', 'ALL', '', '', '', '', 143906, 'Using where; Using filesort'
2, 'DERIVED', 'dt', 'ALL', '', '', '', '', 150813, 'Using temporary'
2, 'DERIVED', 'mst', 'eq_ref', 'PRIMARY', 'PRIMARY', '20', 'testdb.dt.KBN', 1, 'Distinct'
viewを介せず直接下記のクエリーを実行すると
処理時間0.0024sで検索結果がもとまります。
--------------------------------------------------------------
viewを使わないクエリー
--------------------------------------------------------------
select distinct
`dt`.`KEYID` AS KEYID,
`dt`.`KBN` AS KBN,
`dt`.`MEMO` AS MEMO,
`dt`.`SUBC01` AS SUBC01,
`dt`.`SUBC02` AS SUBC02,
`dt`.`SUBN01` AS SUBN01,
`dt`.`SUBN02` AS SUBN02,
`mst`.`NM` AS NM,
`mst`.`MSTDATE` AS MSTDATE,
from (`dt` left join `kmst` on((`dt`.`KBN` = `mst`.`KBN`)))
where KEYID = 10010
order by KEYID,MSTDATE DESC,KBN;
--------------------------------------------------------------
viewを使わないクエリーのexplain結果
--------------------------------------------------------------
id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
1, 'SIMPLE', 'dt', 'ref', 'PRIMARY,idx_dt_keyid', 'PRIMARY', '4', 'const', 10, 'Using temporary; Using filesort'
1, 'SIMPLE', 'mst', 'eq_ref', 'PRIMARY', 'PRIMARY', '20', 'testdb.dt.KBN', 1, ''
なんとかviewを使って処理速度改善を図りたいのですが、ご意見いただけないでしょうか。
よろしくお願いいたします。
No.1ベストアンサー
- 回答日時:
'Using temporary'とUsing filesort'が使われているので、実表に対して大規模なソート(おそらくdt)処理が走っていることが確認できますね。
これはview内でdistinctを使用しているせいだと思いますが、distinctをview内に定義せず、検索クエリー側で指定する訳にはいきませんか?hogyaさん
貴重な情報ありがとうございます。
教えて頂いたようにview内でdistinctせず、viewテーブル検索側でdistinctするようにし
クエリーを実行した結果、期待するような速度になりました。
--------------------------------------------------------------
view内でdistinctしない場合のクエリーのexplain結果
--------------------------------------------------------------
id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
1, 'SIMPLE', 'dt', 'ref', 'PRIMARY,idx_dt_keyid', 'PRIMARY', '4', 'const', 10, 'Using temporary; Using filesort'
1, 'SIMPLE', 'mst', 'eq_ref', 'PRIMARY', 'PRIMARY', '20', 'testdb.dt.KBN', 1, ''
この方法で対応を進めたいと思います。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
エクセルの関数について教えて...
-
”photo id” とは何ぞや?
-
SQLサーバから、項目の属性(型...
-
マイクラPC版のコマンドで効率...
-
sqlで、600行あるテーブルを100...
-
SQLの検索について
-
ファミマTカード会員番号
-
阪急三番街 ATM(ゆうちょ)は...
-
Access パラメータクエリをcsv...
-
inner joinをすると数がおかし...
-
カンマ区切りの文字列を検索する
-
#1136 - Column count doesn't ...
-
tinyint(1) についての質問です。
-
LEFT JOIN とRIGHT JOINの合体...
-
フィールド名を変数で指定するには
-
SQL Left Join で重複を排除す...
-
Yahoo .comの idには年齢制限、...
-
上位3位を求めるSQL文は?
-
副問合せの書き方について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
エクセルの関数について教えて...
-
VIEWの元のテーブルのindexって...
-
副問合せの書き方について
-
select文のwhere句に配列を入れ...
-
マイクラPC版のコマンドで効率...
-
SQLサーバから、項目の属性(型...
-
エラー 1068 (42000): 複数の主...
-
[MySQL] 3つのテーブルの結合で...
-
Access パラメータクエリをcsv...
-
SQLにて特定の文字を除いた検索...
-
SQL Left Join で重複を排除す...
-
ストアドのエラーについて
-
Unionした最後にGROUP BYを追加...
-
バインド変数について
-
PL/SQLの変数について
-
sqlで、600行あるテーブルを100...
-
WordpressのContact form 7でzi...
-
selectした大量データをinsert...
-
inner joinをすると数がおかし...
おすすめ情報