我有一个SQLite表t1,它有三列:c1、c2和c3,它们在(c1,c2)上具有复合索引。我想运行以下查询:
Select max(c2) from t1 where c1=Value and c3 not like "abcd%"。
现在,它可以使用复合索引来过滤那些具有匹配值的c1的记录,并应用c3的where条件,然后使用max(c2)选择记录。
或者使用完整的复合索引对所有记录进行c1过滤,匹配值,反向遍历c2 (降序),然后比较where条件。
在我的情况下,第二种方法会更快。
问题是SQLLite如何优化这个查询:第一次还是第二次?
发布于 2016-02-10 12:59:39
SQLite有一个最小/最大优化,但只适用于非常简单的查询。
对于带有WHERE子句的查询,优化器实际上并不知道MAX()函数的行为,因此它被视为任何其他聚合函数,即必须用每个值调用该函数。因此,将只使用索引的第一列。
为了能够使用这两个列,请重写查询以使用c2进行排序:
select c2
from t1
where c1 = Value
and c3 not like 'abcd%'
order by c2 desc
limit 1;https://stackoverflow.com/questions/35312477
复制相似问题