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可以让所有列都是
数值的
,即使它们实际上最终包含文本数据)。完成后,它将执行
插入操作
(在单个事务中,否则需要很长时间)

为了提高性能,我在每一行上都添加了一个基本索引。但是,这在一定程度上增加了数据库的大小,只提供了一个适度的改进

数据有三种基本类型:

  • 单个值,表示程序版本等
  • 少数值(1000),主要输出数据
  • 第一种类型显然不需要索引,因为它永远不会被排序。 第二种类型应该有一个索引,因为它通常会被过滤。 第三种类型可能不需要索引,因为它将在输出中使用。 在将特定值放入数据库之前确定它是哪种类型会很烦人,但这是可能的

    我的问题有两个:

  • 除了我所看到的大小增加之外,是否存在一些无关索引的隐藏成本
  • 有没有更好的方法来索引
    形式的过滤查询,其中foo在(5)中,bar在(12,14,15)
    ?请注意,我不知道用户将选择哪些列,除了类型2列之外

  • 阅读相关文档: ; ;

    优化查询最重要的一点是避免I/O,因此不应该为少于十行的表编制索引,因为所有数据都可以放在一个页面中,因此创建索引只会迫使SQLite为索引读取另一个页面

    在大表中查找记录时,索引非常重要

  • 由于每个索引也需要更新,因此无关索引会使表更新速度变慢

  • SQLite在查询中每个表最多只能使用一个索引。 通过在两列
    foo
    bar
    上设置一个索引,可以最佳地优化此特定查询。 但是,为所有可能的查找列组合创建这样的索引很可能不值得。 如果查询是动态生成的,最好的办法可能是为每个具有良好选择性的列创建一个索引,并依靠SQLite来选择最佳索引


  • 不要忘记运行。

    阅读相关文档: ; ;

    优化查询最重要的一点是避免I/O,因此不应该为少于十行的表编制索引,因为所有数据都可以放在一个页面中,因此创建索引只会迫使SQLite为索引读取另一个页面

    在大表中查找记录时,索引非常重要

  • 由于每个索引也需要更新,因此无关索引会使表更新速度变慢

  • 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个索引)来说确实是模糊合理的。