Java EE で MySql データベースを使用する Web プロジェクトに取り組んでいます。全体で 300 万行を超える 3 つのテーブルのデータを要約するビューが必要でした。各テーブルはインデックス付きで作成されました。しかし、[group by] で作成したビューからの条件付き select ステートメントの検索で、インデックスを利用する方法がわかりませんでした。
MySql でビューを使用するのは得策ではないという提案を人々から受けています。Oracleのようにmysqlでビューのインデックスを作成できないためです。しかし、私が取ったいくつかのテストでは、ビューの選択ステートメントでインデックスを使用できます。たぶん、私はそれらのビューを間違った方法で作成しました。
私の問題を説明するために例を使用します。
NBA ゲームのハイスコアのデータを記録するテーブルがあり、列 [hapend_in] にインデックスがあります。
CREATE TABLE `highscores` (
`tbl_id` int(11) NOT NULL auto_increment,
`happened_in` int(4) default NULL,
`player` int(3) default NULL,
`score` int(3) default NULL,
PRIMARY KEY (`tbl_id`),
KEY `index_happened_in` (`happened_in`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
データを挿入(8行)
INSERT INTO highscores(happened_in, player, score)
VALUES (2006, 24, 61),(2006, 24, 44),(2006, 24, 81),
(1998, 23, 51),(1997, 23, 46),(2006, 3, 55),(2007, 24, 34), (2008, 24, 37);
次に、コービー・ブライアントが毎年獲得した最高得点を表示するビューを作成します
CREATE OR REPLACE VIEW v_kobe_highScores
AS
SELECT player, max(score) AS highest_score, happened_in
FROM highscores
WHERE player = 24
GROUP BY happened_in;
コービーが2006 年に獲得した最高得点を確認するための条件文を書きました。
select * from v_kobe_highscores where happened_in = 2006;
mysqlのヒキガエルで説明すると、mysqlはすべての行をスキャンしてビューを形成し、[happened_in]のインデックスを使用せずに、条件付きのデータを見つけることがわかりました。
explain select * from v_kobe_highscores where happened_in = 2006;
私たちのプロジェクトで使用するビューは、数百万行のテーブル間で構築されています。ビューのデータ取得ごとにテーブルからすべての行をスキャンすることは受け入れられません。助けてください!ありがとう!
@zerkmsこれが私が実際にテストした結果です。の間に大きな違いは見られません。@ spencer7593 の指摘は正しいと思います。MySQL オプティマイザは、ビュー クエリでその述語を「プッシュ」しません。