我有一个sqlite密码数据库,包含大约80000条记录(包含7列)。它目前在搜索记录时花费了太多时间。我需要一种基于某些标准(需要索引之类的东西)搜索1个或多个记录的优化方法,以便减少搜索时间。有没有人知道如何实现这一目标?迫切需要帮助。 :(
EDITED: 我正在使用sqlite密码API,因为我需要将加密数据存储在sqlite数据库中。我设置了pragma密钥,使用的加密是AES - 256.我还在我的数据库中的每个表上创建了索引。但我的搜索并不快。它花了太多时间。需要尽快解决这个问题。
第二次编辑时间: 嘿伙计们,这次我很难受。我在用户点击文本字段后立即进行搜索。总结一下这个问题,让我告诉你流程。
我有2个文本字段和一个包含~80k记录和7列的表。 当我在field1中键入任何内容时,将使用field1的内容对表进行搜索。因此,假设我在field1中键入'a',然后select查询返回column1中包含'a'字母的所有记录。因此,一旦我输入字母,就会搜索表格。 现在提升没有问题。它没有任何时间延迟返回记录。查询是:
SELECT DISTINCT <COL1> COLLATE NOCASE as <COL1> from <TABLE_NAME> where <COL1> like '%ab%' LIMIT 0,501
现在,如果我点击字段2,那么我会在1秒后看到field2上的光标,因为此查询会执行:
SELECT DISTINCT <COL2> COLLATE NOCASE as <COL2> from <TABLE_NAME> where <COL1> like '%ab%' LIMIT 0,501
现在,如果我在field2上输入任何内容,则db获取过程需要时间。这是最终查询:
SELECT DISTINCT <COL2> COLLATE NOCASE as <COL2> from <TABLE_NAME> where <COL1> like '%ab%' AND <COL2> like '%cd%' LIMIT 0,501
当我试图分析问题时,我发现问题是由于DISTINCT关键字造成的。 我在列上创建了索引,如下所示:
CREATE INDEX <name1> on <TABLE_NAME>(<COL1>)
CREATE INDEX <name2> on <TABLE_NAME>(<COL1> COLLATE CASE)
CREATE INDEX <name3> on <TABLE_NAME>(<COL2>)
CREATE INDEX <name4> on <TABLE_NAME>(<COL2> COLLATE CASE)
任何人都知道如何快速进行此检索。
答案 0 :(得分:2)
像索引这样的东西? SQLite完全能够使用索引as explained here in the docs.但是,表的结构和目的将决定如何最好地实现它们。
答案 1 :(得分:0)
我假设您使用SQLite合并源。如果您还需要全文搜索,可以在sqlite3.c
之上添加此定义(或者您需要搜索哪些值?)。
#define SQLITE_ENABLE_FTS3
然后使用提到的docs VeryVito 创建索引。