索引查询优化= SQL

时间:2017-04-26 08:53:03

标签: sql postgresql query-optimization

这是我过去考试问题的一部分 -

优化以下内容并假设在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'; 

我尝试将其拆分为&lt;&gt;强制使用索引 - 但我的回答是错误的。我想知道是否有人可以提供帮助并指出我正确的方向?

1 个答案:

答案 0 :(得分:3)

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

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

&#34;优化以下内容&#34;但是,可以允许通过创建另一个索引来间接优化查询。该索引至少应包含并以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可能使用与否的提议。