Sqlite3数据库的索引优化

时间:2016-02-10 10:21:53

标签: android indexing sqlite android-sqlite database-performance

我有一个SQLite表 t1 ,其中有三列, c1 c2 c3 ,其中复合指数(c1,c2)。我想运行以下查询:

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

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

或者它可以使用完整的复合索引来过滤所有记录,其中c1与Value匹配,并以反向(降序)走c2,然后比较where条件。

在我的情况下,第二种方法会更快。

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

1 个答案:

答案 0 :(得分:1)

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;