Sqlite3 数据库的索引优化
Index Optimization for Sqlite3 Database
我有一个包含三列的 SQLite table t1,c1,c2 和 c3 以及 (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;
我有一个包含三列的 SQLite table t1,c1,c2 和 c3 以及 (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;