回答

收藏

sqlite3选择最小,最大在一起要比分别选择慢得多

技术问答 技术问答 40 人阅读 | 0 人回复 | 2023-09-12

sqlite> explain query plan select max(utc_time) from RequestLog;0|0|0|SEARCH TABLE RequestLog USING COVERING INDEX key (~1 rows) # very fastsqlite> explain query plan select min(utc_time) from RequestLog;0|0|0|SEARCH TABLE RequestLog USING COVERING INDEX key (~1 rows) # very fastsqlite> 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已经用过了,不能用)?还是对这种行为有什么解释?
3 N5 D' s" U; D0 M; {* [& x! }0 o编辑1min(time) from FixLog;0|0|0|SCAN TABLE FixLog (~1000000 rows)                min(time) from FixLog;0|0|0|SCAN TABLE FixLog (~1000000 rows)               
" A/ ^9 F* t! i2 U. F    解决方案:                                                                " P& u0 d  L8 N! y. ~
                                                                这是sqlite如下:http//www.sqlite.org/optoverview.html#minmax :假设有适当的索引,在对数时间内优化以下查询:& E6 Q0 |! D& u! z# z
    SELECT MIN(x) FROM table; SELECT MAX(x) FROM table;为了进行这些优化,它们必须完全按照上面显示的形式显示-
5 E' r* O3 `- H4 I; o' E只更改表和列的名称。不允许添加WHERE对结果进行算术操作的子句或结果集必须包含一列。MIN或MAX函数中的列必须是索引列。
  O* l: @: y' x) J! i. _更新(2017/06/23):最近更新为表示索引搜索可能满足单个索引MAX或MIN查询(允许算术操作);
/ t, c4 C$ l6 t) h. O  s; C/ ^然而,它们仍然阻止在单个查询中使用多个这样的聚合运算符(因此MIN,MAX仍然很慢):' V" K1 o1 R; Y/ w2 b2 V% P! W
它可以通过执行单个索引而不是扫描整个表来找到MIN()或MAX()查询聚合函数(其参数是索引的最左列)。# ^: U9 S, C  v
SELECT MIN(x) FROM table;SELECT MAX(x) 1 FROM table;
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则