sqlite索引来优化NOT查询

时间:2016-01-25 20:58:46

标签: 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 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 ........?

" by thekeys" index优化查找按该键查找记录的查询,除非查询使用该查找的逻辑否定。是否使用NOT,或者!=它似乎没有什么区别。它总是只扫描整个表而不使用任何索引。我做,像...部分索引或什么?如何优化NOT查询?

1 个答案:

答案 0 :(得分:2)

数据库假定列包含许多不同的值。 因此,使用!=过滤器估计不会减少足以使附加索引查找值得的结果数量。

如果您实际上只有很少的值,请重写查询以使其使用相等(=)或范围(<>)。