我正在做一个基于JavaEE的MySql数据库的web项目.我们需要一个视图来总结3个表中总计超过300万行的数据.每个表都是用索引创建的.但我还没有找到一种方法来利用我们用[group by]创建的视图中的条件select语句检索中的索引.
我从using views in MySql is not a good idea人那里得到了一些建议.因为你不能像oracle那样在mysql中为视图创建索引.但在我做的一些测试中,索引可以用在view select语句中.也许我以错误的方式创建了这些视图.
我将用一个例子来描述我的问题.
我们有一个记录NBA比赛高分数据的表格,在[happend_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;
我写了一份有条件的声明,让kobe分在2006分中获得最高分数;
select * from v_kobe_highscores where happened_in = 2006;
当我在toad for mysql中解释它时,我发现mysql已经扫描了all rows来形成视图,然后在其中查找带有条件的数据,而不使用[Occessed_in]上的索引.
explain select * from v_kobe_highscores where happened_in = 2006;
我们在项目中使用的视图是在具有数百万行的表中构建的.在每个视图数据检索中扫描表中的所有行是不可接受的.请帮忙!谢谢
@虫族这是我在现实生活中测试的结果.我看不出他们之间有什么不同.我认为@spencer7593的观点是正确的.The MySQL optimizer doesn't "push" that predicate down in the view query.