sqlite> explain query plan select max(utc_time) from RequestLog; 0|0|0|SEARCH TABLE RequestLog USING COVERING INDEX key (~1 rows) # very fast sqlite> explain query plan select min(utc_time) from RequestLog; 0|0|0|SEARCH TABLE RequestLog USING COVERING INDEX key (~1 rows) # very fast sqlite> explain query plan select min(utc_time), max(utc_time) from RequestLog; 0|0|0|SCAN TABLE RequestLog (~8768261 rows) # will be very very slow
当我分别使用min和时max,它可以完美地工作。但是,出于某些原因,当我同时选择min和时,sqlite将“忘记”索引max。有什么我可以做的配置(我Analyze已经用过了,将无法使用)?或对此行为有任何解释吗?
min
max
Analyze
sqlite> .schema CREATE TABLE FixLog( app_id text, __key__id INTEGER, secret text, trace_code text, url text, action text,facebook_id text,ip text, tw_time datetime,time datetime, tag text,to_url text, from_url text,referer text,weight integer, Unique(app_id, __key__id) ); CREATE INDEX key4 on FixLog(action); CREATE INDEX time on FixLog(time desc); CREATE INDEX tw_time on FixLog(tw_time desc); sqlite> explain query select min(time) from FixLog; 0|0|0|SEARCH TABLE FixLog USING COVERING INDEX time (~1 rows) sqlite> explain query select max(time) from FixLog; 0|0|0|SEARCH TABLE FixLog USING COVERING INDEX time (~1 rows) sqlite> explain query plan select max(time), min(time) from FixLog; 0|0|0|SCAN TABLE FixLog (~1000000 rows)
假设存在适当的索引,将优化以下形式的查询以在对数时间内运行: SELECT MIN(x) FROM table; SELECT MAX(x) FROM table; 为了进行这些优化,它们必须完全按照上面显示的形式显示- 仅更改表和列的名称。不允许添加WHERE子句或对结果进行任何算术运算。结果集必须包含一个列。MIN或MAX函数中的列必须是索引列。
假设存在适当的索引,将优化以下形式的查询以在对数时间内运行:
SELECT MIN(x) FROM table; SELECT MAX(x) FROM table;
为了进行这些优化,它们必须完全按照上面显示的形式显示- 仅更改表和列的名称。不允许添加WHERE子句或对结果进行任何算术运算。结果集必须包含一个列。MIN或MAX函数中的列必须是索引列。
更新(2017/06/23):最近,它已更新为表示索引查找可能满足包含单个MAX或MIN的查询(允许进行算术运算); 但是,它们仍然阻止在单个查询中使用多个这样的聚合运算符(因此MIN,MAX仍然很慢):
可以通过执行单个索引查找而不是通过扫描整个表来满足包含单个MIN()或MAX()聚合函数(其参数是索引的最左列)的查询。例子: SELECT MIN(x) FROM table; SELECT MAX(x)+1 FROM table;
可以通过执行单个索引查找而不是通过扫描整个表来满足包含单个MIN()或MAX()聚合函数(其参数是索引的最左列)的查询。例子:
SELECT MIN(x) FROM table; SELECT MAX(x)+1 FROM table;