[英]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.