用于优化NOT查询的sqlite索引

用于优化NOT查询的sqlite索引,sqlite,optimization,indexing,boolean,Sqlite,Optimization,Indexing,Boolean,当我在sqlite中创建索引时,它会优化对该键的查询。但有时我想查找排除该键某些值的记录,而我的索引似乎根本不用于优化这些值。我不知道如何写一个索引来优化一个不匹配键的查询 这是我所说的一个例子: CREATE TABLE place ( id INTEGER PRIMARY KEY, thing INTEGER NOT NULL, thekey INTEGER NOT NULL, unique(thing,thekey)); CREATE INDEX bythekeys O

当我在sqlite中创建索引时,它会优化对该键的查询。但有时我想查找排除该键某些值的记录,而我的索引似乎根本不用于优化这些值。我不知道如何写一个索引来优化一个不匹配键的查询

这是我所说的一个例子:

CREATE TABLE place (
  id INTEGER PRIMARY KEY,
  thing INTEGER NOT NULL, 
  thekey INTEGER NOT NULL,
  unique(thing,thekey));

CREATE INDEX bythekeys ON place(thekey);

EXPLAIN QUERY PLAN SELECT thing FROM place WHERE NOT thekey = ?;
-- => 0     0              0     SCAN TABLE place
EXPLAIN QUERY PLAN SELECT thing FROM place WHERE thekey = ?;
-- => 0     0              0     SEARCH TABLE place USING INDEX bythekeys (thekey=?)

CREATE INDEX bythenotkeys ON ........?

“bythekeys”索引优化按该键查找记录的查询,除非查询使用该查找的逻辑求反。无论是否使用,或!=这似乎没有什么区别。它总是只扫描整个表而不使用任何索引。我做什么,比如。。。部分索引还是什么?如何优化NOT查询?

数据库假定一列包含许多不同的值。 所以使用
=过滤器估计不会减少足够多的结果,从而使额外的索引查找变得有价值


如果实际值很少,请重写查询,使其使用相等(
=
)或范围(
)。

谢谢。该列包含许多不同的值,但每个值都有许多重复的值。例如,删除42条记录可能会删除所有记录的10%。我确实尝试过使用键<?1或键>?1,但确实,额外的索引查找似乎不值得。