mysql:14073
From: YuGo <YuGo <yu.gotou@xxxxxxxxxx>>
Date: Fri, 22 Jun 2007 15:13:54 +0900
Subject: [mysql 14073] Re: ビューをWHERE条件付きでSELECTすると遅くなる
bm2dx.dd@xxxxxxxxxxどの。 C.F2にはインデックスがあるがV.CF2にはインデックスがつけられないので 遅いということはないですか。ためしに下のようなテーブルを作って、 tmp_tbl.CF2にインデックスをつけてみたらどうですか。 CREATE tmp_tbl SELECT A.F1 AF1, A.F2 AF2, B.F1 BF1, B.F2 BF2,C.F1 CF1, C.F2 CF2 FROM A LEFT JOIN B ON A.ID = B.ID LEFT JOIN C ON A.ID = ID WHERE A.F1 = 1 AND B.F1 = 1; > はじめまして、お世話になります。 > VIEWの使用で困っています。 > あるVIEWを作りました。 > 以下のような感じのVIEWです。(説明のために簡略化しています。) > テーブルA, B, C は1万件程度のレコード数です。(A:B = 1:n A:C = 1:n) > CREATE VIEW V AS > SELECT A.F1 AF1, A.F2 AF2, B.F1 BF1, B.F2 BF2, C.F1 CF1, C.F2 CF2 > FROM A > LEFT JOIN B ON A.ID = B.ID > LEFT JOIN C ON A.ID = C.ID > WHERE A.F1 = 1 AND B.F1 = 1; > > (1) SELECT * FROM V; > を実行すると、0.1秒以下で完了します。 > > (2) SELECT * FROM V WHERE CF2 = 1; > を実行したところ、60秒くらいかかってしまいます。 > > でも、 > > (3) > SELECT A.F1 AF1, A.F2 AF2, B.F1 BF1, B.F2 BF2, C.F1 CF1, C.F2 CF2 > FROM A > LEFT JOIN B ON A.ID = B.ID > LEFT JOIN C ON A.ID = C.ID > WHERE A.F1 = 1 AND B.F1 = 1 AND C.F2 = 1 > > というSELECT文を実行すると0.1秒以下で完了します。 > > VIEWにWHERE句を入れると遅くなったりするのでしょうか? > それとも、テーブル構造や結合の仕方でネックになっている部分があるのでしょ > うか。 > (2)と(3)で、そんなにコストが変わるとは予想していませんでした。 > > OSはFedora Core 6 > MySQLは 5.0.41-log Source distribution > を使用しています。 > >
14072 2007-06-22 12:43 [<bm2dx.dd@xxxxxxxxxx] ビューをWHERE条件付きでSELECTすると遅くなる -> 14073 2007-06-22 15:13 ┗[YuGo <yu.gotou@xxxxx] 14079 2007-06-22 21:22 ┗[hyu-ga <bm2dx.dd@xxx] @ 14082 2007-06-23 09:15 ┗["Yu Go" <yotarog@xxx]