我在 JavaEE 上做一个使用 MySql 数据库的网络项目。我们需要一个视图来汇总来自3个表的数据,总行数超过3M。每个表都是使用索引创建的。但是我还没有找到一种方法来利用条件选择语句检索中的索引优势,这种检索是从我们用[ group by ]创建的视图中获得的。
我从人们那里得到了一些建议。因为不能像 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;
我写了一个 If判断语句,看看 科比在 二零零六年中得到的最高分;
select * from v_kobe_highscores where happened_in = 2006;
当我在 toad 中为 mysql 解释它时,我发现 mysql 通过扫描 所有行来形成视图,然后找到包含条件的数据,而不使用[ happened _ in ]上的索引。
explain select * from v_kobe_highscores where happened_in = 2006;
我们在项目中使用的视图是在具有数百万行的表之间构建的。在每个视图数据检索中扫描表中的所有行是不可接受的。救命啊!谢谢!
@ zerkms 这是我在现实生活中测试的结果。我看不出。我认为@spencer7593的观点是正确的。MySQL 优化器不会在视图查询中“下推”谓词。