【问题标题】:sqlite index to optimize NOT queries用于优化 NOT 查询的 sqlite 索引
【发布时间】:2016-01-25 20:58:46
【问题描述】:

当我在 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 还是 != 似乎都没有什么区别。它总是只扫描整个表而不使用任何索引。我是否会制作……部分索引或其他内容?如何优化 NOT 查询?

【问题讨论】:

    标签: sqlite optimization indexing boolean


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。对于这些值中的每一个,该列包含许多不同的值,但有很多重复的值。例如,消除 42 条可能会减少 10% 的记录。我确实尝试使用 key ?1 并且确实额外的索引查找似乎不值得。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    相关资源
    最近更新 更多