Sqlite 何时包含索引(自动启发式)
我有一个软件,它接收一个数据库,并使用它根据用户需要生成图形(主要是以Sqlite 何时包含索引(自动启发式),sqlite,indexing,Sqlite,Indexing,我有一个软件,它接收一个数据库,并使用它根据用户需要生成图形(主要是以SELECT AVG()为x,AVG()为y的形式从WHERE in(and…)进行查询)。这非常有效 我有一个简单的脚本,它被传递(通常是大量)文件,每个文件描述一行 name=foo x=12 y=23.4 ....... etc....... 脚本遍历每个文件,保存变量名,并对每个文件进行INSERT查询。然后加载变量名,sort | uniq,并对其进行CREATE TABLE语句(足够有趣的是,sqlite可以让所
SELECT AVG()为x,AVG()为y的形式从WHERE in(and…
)进行查询)。这非常有效
我有一个简单的脚本,它被传递(通常是大量)文件,每个文件描述一行
name=foo
x=12
y=23.4
....... etc.......
脚本遍历每个文件,保存变量名,并对每个文件进行INSERT
查询。然后加载变量名,sort | uniq
,并对其进行CREATE TABLE
语句(足够有趣的是,sqlite可以让所有列都是数值的
,即使它们实际上最终包含文本数据)。完成后,它将执行插入操作
(在单个事务中,否则需要很长时间)
为了提高性能,我在每一行上都添加了一个基本索引。但是,这在一定程度上增加了数据库的大小,只提供了一个适度的改进
数据有三种基本类型:
形式的过滤查询,其中foo在(5)中,bar在(12,14,15)
?请注意,我不知道用户将选择哪些列,除了类型2列之外阅读相关文档: ; ; 优化查询最重要的一点是避免I/O,因此不应该为少于十行的表编制索引,因为所有数据都可以放在一个页面中,因此创建索引只会迫使SQLite为索引读取另一个页面 在大表中查找记录时,索引非常重要
foo
和bar
上设置一个索引,可以最佳地优化此特定查询。
但是,为所有可能的查找列组合创建这样的索引很可能不值得。
如果查询是动态生成的,最好的办法可能是为每个具有良好选择性的列创建一个索引,并依靠SQLite来选择最佳索引不要忘记运行。阅读相关文档: ; ; 优化查询最重要的一点是避免I/O,因此不应该为少于十行的表编制索引,因为所有数据都可以放在一个页面中,因此创建索引只会迫使SQLite为索引读取另一个页面 在大表中查找记录时,索引非常重要
foo
和bar
上设置一个索引,可以最佳地优化此特定查询。
但是,为所有可能的查找列组合创建这样的索引很可能不值得。
如果查询是动态生成的,最好的办法可能是为每个具有良好选择性的列创建一个索引,并依靠SQLite来选择最佳索引还有,别忘了运行。我正在寻找的内容。作为补充,如果您想知道在sqlite规则下,覆盖n列的任何子集需要多少索引(多列索引从左侧使用,因此
foo,bar
可以从foo,bar,baz
索引中使用,但不能从foo,baz,bar
索引中使用)对于偶数n,结果是n!/((n/2)!^2;对于奇数n,结果是n!/((n-1)/2)!((n+1)/2)!。也就是说,1、2、3、6、10、20、35、70、126、252……这对于5-6列(分别是10和20个索引)来说确实是模糊合理的。我一直在寻找的。作为旁注,如果您想知道在sqlite规则下,覆盖n列的任何子集需要多少索引(多列索引从左侧使用,因此foo,bar
可以从foo,bar,baz
索引中使用,但不是foo,baz,bar
索引),它最终是n!/((n/2)!)^2表示偶数n,n!/((n-1)/2)!((n+1)/2)!)表示奇数n。也就是说,1、2、3、6、10、20、35、70、126、252……这对于5-6列(分别为10和20个索引)来说确实是模糊合理的。