如果where标准是!=,则不使用数据库索引

时间:2009-11-18 22:06:45

标签: sql database

我在列上有索引,在查询

时正确使用
select * from Table where x = 'somestring'

但是,当查询类似于

时,似乎没有使用它
select * from Table where x != 'someotherstring'

这是正常的还是我在查询中遗漏了其他内容?实际的查询当然要大得多,因此可能是由其他因素造成的。还有其他想法为什么不在查询中使用索引?

6 个答案:

答案 0 :(得分:14)

这很正常。仅当您具有'='条件时才会使用索引。搜索索引为!=条件无效。

同样,这可能会使用索引(在Oracle中)

select * from Table where x like 'some%'

但这不会

select * from Table where x like '%thing%'

另外, select * from Table where x between 1 and 10将使用索引

但不是 select * from Table where x not between 1 and 10

答案 1 :(得分:3)

如果索引是聚类的,并且索引属性的值不是很多(因此我们可以快速决定我们可以跳过哪些块),它可以使用索引。但是,如果索引属性是一个键,那么在这种情况下使用索引绝对没有意义。

答案 2 :(得分:2)

这是绝对正常的。 index用于查找确切的内容。当我告诉你不要以'S'开头时,当我要求你看字典时,你从哪里开始。

你总是可以这样做。

select * from Table a
where not exist (select * from table b where x = 'somestring' and a.key = b.key)

答案 3 :(得分:1)

这确实很正常 - 要使用索引,您需要使用完全匹配(如“=”等于运算符),或类似范围查询。

通过索引查找通常无法满足定义“否定”条件( NOT 某些内容或其他内容)的查询 - 您必须查找除特定值之外的所有内容。这不能很好地工作 - 通常,全表扫描(SQL Server中的聚簇索引扫描)会更快,只需检查要匹配的条件(或在这种情况下不匹配)。

答案 4 :(得分:0)

我认为a!=条件可以使用索引(在MSSQL中)。根据MSSQL中的执行计划,如果我在单个字段上有一个索引,并且我在该字段上应用了一个where子句,一个带有!=和一个带有=,它们都会产生相同的执行计划,两者都使用索引求。

答案 5 :(得分:-1)

您没有说出您正在使用的数据库引擎。

例如,MS SQL Server同时具有Equality indexesInequality indexes。 后者在not equal运算符正在运行时使用。