我有一个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如何优化此查询:第一个或第二个?
答案 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;