
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を探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
【Transact-sql】 execの結果を...
-
ソフトバンクの無料着うたのお...
-
WordpressのContact form 7でzi...
-
php+mysqlで複数選択削除について
-
テーブルが5つの時の結合の仕...
-
Postgreのupdateコマンドでエラー
-
PL/SQLの変数について
-
select文のwhere句に配列を入れ...
-
エクセルの関数について教えて...
-
AUTO_INCREMENTのあるテーブル...
-
sqlで、600行あるテーブルを100...
-
SQLにて特定の文字を除いた検索...
-
#1136 - Column count doesn't ...
-
最小値をUPDATE
-
MYSQLの論理削除について質問で...
-
HAVING count()で重複したデー...
-
selectした大量データをinsert...
-
SQLサーバから、項目の属性(型...
-
このサイト(ttp://127.0.0.1/p...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
エラー 1068 (42000): 複数の主...
-
エクセルの関数について教えて...
-
VIEWの元のテーブルのindexって...
-
sqlで、600行あるテーブルを100...
-
SQLサーバから、項目の属性(型...
-
SQL Left Join で重複を排除す...
-
Access パラメータクエリをcsv...
-
クエリ表示と、ADOで抽出したレ...
-
ストアドのエラーについて
-
マイクラPC版のコマンドで効率...
-
バインド変数について
-
SQLにて特定の文字を除いた検索...
-
副問合せの書き方について
-
【Transact-sql】 execの結果を...
-
”photo id” とは何ぞや?
-
mysql+phpをつかったカートつく...
-
MySQL5.5 viewの処理速度改善に...
-
select文のwhere句に配列を入れ...
-
テーブル名を省略して「h.id」...
おすすめ情報