繁体   English   中英

索引查询优化= SQL

[英]Indexed Query Optimisation = 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'; 

我试过这个,因为分裂<>强制使用索引 - 但我的回答是错误的。 我想知道是否有人可以提供帮助并指出我正确的方向?

在我看来,原始查询本身无法进行优化。

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

但是,“优化以下内容”可能允许通过创建另一个索引来间接优化查询。 该索引至少应包含并以memberType

create index idx1 on members (membertype);

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

说完这个,我们可能会想要这个:

create index idx2 on members (membertype, lname);

所以DBMS读取索引,找到学生,立即看到名称是否为Rogers,并且只访问表中所需的记录。

更好的索引仍然是包含所有相关列的覆盖索引,因此不再需要读取表,因为所有信息都在索引中:

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

如前所述,当DBMS假定大多数记录仍然匹配时,它仍然可以读取整个表。 索引只是DBMS可能使用与否的提议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM