2017-04-26 125 views
1

这是我过去的考题一部分 -索引查询优化= SQL

优化以下,假设情况是Members.lname指数:

SELECT fname, lname 
FROM Members 
WHERE lname <> 'Rogers' 
    AND memberType='Student'; 

因此,我曾尝试:

SELECT fname, lname 
FROM Members 
WHERE lname > 'Rogers' OR lname < 'Rogers'AND memberType='Student'; 

我试过这个分裂<>强制使用索引 - 我的答案是错误的。我想知道是否有人能够帮助并指引我朝着正确的方向发展?

+0

lname <>'Rogers'? – Jens

+2

如果您使用'或'和'和',您必须添加圆括号'或'像'(lname>'罗杰斯'或lname <'罗杰斯')AND memberType ='Student'' – Jens

+0

您的表有多少数据?数据插入后您是否完成分析表? – jarlh

回答

2

在我看来,原始查询本身不能被优化。

lname上有一个索引应该对查询没有影响。所有成员都将有一个名字,并且会有很少的成员是罗杰斯。所以DBMS不应该使用索引,而只是读完整个表。

“优化以下”,但是,可能允许通过创建另一个索引来间接优化查询。该指数应至少包含与memberType开始:

create index idx1 on members (membertype); 

这是否索引将用于该查询可能会取决于什么是在表中。如果99%的成员是学生,DBMS应该读取完整的表格。如果只有很少的学生(比如3%)使用索引是有意义的,那么DBMS将使用该索引来查找表中的学生,然后在记录中检查lname

话虽如此,我们可能想要这个:

create index idx2 on members (membertype, lname); 

所以DBMS读取索引,找到学生,如果名称是罗杰斯,只有访问表所需的记录立即看到。

一个更好的指标仍然会包含相关的所有列覆盖索引,所以表不必再被读取,因为所有信息都在索引:

create index idx3 on members (membertype, lname, fname); 

如前所述,数据库管理系统可能仍会在假设大多数记录匹配时读取整个表。索引只是它可能使用或不使用的DBMS的报价。