Sqlite3 数据库的索引优化

Index Optimization for Sqlite3 Database

我有一个包含三列的 SQLite table t1c1c2c3 以及 (c1, c2) 上的 复合索引。我想 运行 以下查询:

Select max(c2) from t1 where c1=Value and c3 not like "abcd%".

现在,它可以使用复合索引只过滤那些c1匹配Value的记录,并应用c3的where条件,然后选择max的记录(c2).

或者也可以使用全复合索引过滤所有c1匹配Value的记录,反向走c2(降序),然后比较where条件

第二种方法对我来说会更快。

问题是 SQLLite 如何优化这个查询:第一个还是第二个?

SQLite 有一个 MIN/MAX optimization,但只适用于非常简单的查询。

对于带有 WHERE 子句的查询,优化器实际上并不知道 MAX() 函数的行为方式,因此它被视为与任何其他聚合函数一样,即必须使用每个值调用该函数。 因此,只会使用索引的第一列。

为了能够使用这两列,重写查询以使用 c2 进行排序:

select c2
from t1
where c1 = Value
  and c3 not like 'abcd%'
order by c2 desc
limit 1;