我正在使用 Java EE 上的 MySql 数据库开发一个 Web 项目。我们需要一个视图来汇总 3 个表中的数据,总共超过 300 万行。每个表都是用索引创建的。但是我还没有找到一种方法来利用我们使用 [group by] 创建的视图中的条件选择语句检索中的索引。
我从人们那里得到建议,在 MySql 中使用视图不是一个好主意。因为您不能像在 oracle 中那样为 mysql 中的视图创建索引。但是在我进行的一些测试中,索引可以在视图选择语句中使用。也许我以错误的方式创建了这些视图。
我将用一个例子来描述我的问题。
我们有一个记录 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;
我写了一个条件语句,看看科比在2006年得到的最高分;
select * from v_kobe_highscores where happened_in = 2006;
当我在 toad for mysql 中解释它时,我发现 mysql 已经扫描所有行以形成视图,然后在其中查找具有条件的数据,而不使用 [happened_in] 上的索引。
explain select * from v_kobe_highscores where happened_in = 2006;
我们在项目中使用的视图是在具有数百万行的表中构建的。在每次视图数据检索中扫描表中的所有行是不可接受的。请帮忙!谢谢!
@zerkms 这是我在现实生活中测试的结果。我看不出有太大的区别。我认为@spencer7593 有正确的观点。MySQL 优化器不会在视图查询中“下推”谓词。