我在列上有索引,在查询
时正确使用select * from Table where x = 'somestring'
但是,当查询类似于
时,似乎没有使用它select * from Table where x != 'someotherstring'
这是正常的还是我在查询中遗漏了其他内容?实际的查询当然要大得多,因此可能是由其他因素造成的。还有其他想法为什么不在查询中使用索引?
答案 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)
你总是可以这样做。
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 indexes
和Inequality indexes
。
后者在not equal
运算符正在运行时使用。