如果查询返回所有行,数据库索引是否有用?

时间:2010-09-24 10:50:24

标签: database indexing

如果我在一个返回所有行的查询中使用了一个Index列,那么在where子句中使用Index列是否有利?

例如。 select * from table1 where Salary> 1;

如果所有员工的薪水都大于1,那么在where子句中使用Index列是否有利?

如果数据库最有可能按上述方式使用,那么在插入时索引是否是一个很大的开销?

4 个答案:

答案 0 :(得分:4)

在没有ORDER BY的情况下执行完整扫描时,索引无效。 Oracle索引组织表,Postgresl集群表,MySQL(InnoDB)PRIMARY KEY聚簇索引:给ORDER BY带来很大的性能。

http://dev.mysql.com/doc/refman/5.1/en/innodb-index-types.html

“如果数据库最有可能像上面一样被使用,那么在插入时索引是一个很大的开销吗?” 如果索引适合RAM,一切正常。

答案 1 :(得分:0)

如果您的查询返回所有行,所有列并且没有排序,则索引根本不会帮助此查询。将伪造的谓词放在总是评估为真的情况下是没有意义的。

答案 2 :(得分:0)

问题的形式似乎有点令人困惑。我不认为你真的在问使用某个WHERE子句是否有利。当然,如果你想返回Salary>的行1那么指定它是有利的 - 否则你可能无法恢复你所期望的(数据可能已经改变)!

我假设你真正要问的是这个查询是否可以用索引比没有索引更好。我认为我们没有足够的信息来回答这个问题。我们不知道您正在使用什么DBMS或如何存储表或可能使用哪种类型的索引。例如,如果查询是对视图的查询,并且视图已编制索引或基础上的表被编入索引,那么索引可能会对性能产生很大影响。

但是,在查询中指定SELECT *通常是不好的做法。指定SELECT *意味着即使列集已更改,您也将获得所有列。最好只指定您需要的那些列,因为这样您就有更好的机会获得最有效的执行计划。

答案 3 :(得分:0)

我想知道@ iddqd的答案是否正确。

标准“WHERE Salary>`”会不会需要索引?

MySQL如何知道所有工资都大于1,除非a。)有索引或b。)是否进行全表扫描?

如果您知道需要执行全表扫描,那么您可以使用:

IGNORE INDEX ([*index_list*])

注意MySQL在版本5.1.17之前没有注意ORDER BY和GROUP BY的上述指令。