加速SQLite“选择存在”查询

oogrdqng  于 2023-02-13  发布在  SQLite
关注(0)|答案(1)|浏览(110)

我有一个3GB的SQLite数据库文件,其中有一个表,该表有4000万行和14个字段(大部分是整数和非常短的字符串,还有一个更长的字符串),没有索引、键或其他约束--所以实际上没有什么特别的。我想检查是否有条目中的特定整数字段具有特定的值。
SELECT EXISTS(SELECT 1 FROM FooTable WHERE barField=?)
我对SQLite和数据库没有太多的经验,在我的第一次测试查询中,我震惊地发现这个简单的查询花费了大约30秒。随后的测试表明,如果匹配行出现在开头,速度会快得多,这当然是有道理的。
现在我考虑在应用程序启动时执行初始化SELECT DISTINCT barField FROM FooTable,并将结果缓存在软件中,但我确信一定有一种更干净的SQLite方式来完成此操作,我的意思是,这应该是DBMS工作的一部分,对吗?
但是到目前为止,我只创建了主键来加速查询,但在这里不起作用,因为字段值是不唯一的。那么,我如何才能加速这个查询,使它在恒定时间内工作呢?(它不需要 lightning 般的快,如果它在一秒之内,我就完全没问题了。)
提前感谢您的回答!
哦,在一段不确定的时间内,每个月都会有大约500 K的新行,如果这不会显著增加查询时间,那就太好了。

blmhpbnm

blmhpbnm1#

barField上添加索引应该会加快EXISTS子句中的子查询:

CREATE INDEX barIdx ON FooTable (barField);

要满足查询,SQLite只需搜索索引一次并检测是否至少有一个匹配值。

相关问题