2010-09-24 29 views
1

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

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

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

如果数据库最有可能像上面那样使用,那么在插入时索引的开销会很大?

回答

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,一切都可以。

+0

+1为您的无敌。 – 2012-07-18 01:45:41

0

如果您的查询返回所有行,所有列并且没有排序索引,则根本无法帮助完成此查询。虚假谓词总是没有意义的,总是评价为真。

0

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

我认为你真正想要问的是,这个查询是否可以比没有它的索引更好地执行索引。我认为我们不一定有足够的信息来回答这个问题。我们不知道您正在使用哪个DBMS,或者如何存储表格或可能使用哪种类型的索引。例如,如果查询是对视图的查询,并且对视图进行索引或对其进行索引,则索引可能会对性能产生很大影响。

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

0

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

条件,“WHERE Salary>`”将需要一个索引不是吗?

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

如果你知道一个事实,你将需要执行全表扫描,那么你可以使用:

IGNORE INDEX ([*index_list*]) 

注意MySQL不留意上面的指令中的ORDER BY和GROUP BY之前版本5.1.17。

相关问题