当我在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查询?
答案 0 :(得分:2)
数据库假定列包含许多不同的值。
因此,使用!=
过滤器估计不会减少足以使附加索引查找值得的结果数量。
如果您实际上只有很少的值,请重写查询以使其使用相等(=
)或范围(<
,>
)。