在android上搜索庞大的sqlite数据库

时间:2013-07-28 01:07:36

标签: android database sqlite dictionary cursor


我有一个500,000记录的数据库 想在数据库中搜索,比如在字典搜索中搜索单词 我使用此查询:

SELECT id,word FROM dic WHERE word like 'test%' LIMIT 10

但是慢慢搜索,我索引字段和字段是数据库中的ASC顺序 无法在庞大的数据库中搜索? 例如:
当输入文本为“Hel”时,我会在数据库中以“Hel”开头 数据库创建SQL代码:

CREATE TABLE [dic] (
[id] INTEGER  PRIMARY KEY AUTOINCREMENT NOT NULL,
[word] TEXT(100)  NOT NULL,
[mean] TEXT(1000000)  NULL,
[pron] TEXT(1000)  NULL,
[form] TEXT(1000)  NULL
);
CREATE INDEX [table_index] ON [dic](
[word]  ASC
);

5 个答案:

答案 0 :(得分:3)

LIKE查询通常不使用索引,因此sqlite正在执行表扫描。但是,您可以通过使索引成为范围条件来说服sqlite使用索引,如下所示:

SELECT id, word 
  FROM dic 
 WHERE word BETWEEN 'test' AND 'test{'
 LIMIT 10

注意“测试”< “testa”和“{”> “Z”

答案 1 :(得分:0)

尝试使用glob而不是喜欢,我在某些情况下发现它更快

答案 2 :(得分:0)

在SQLite中,默认情况下,运算符LIKE不区分大小写,这就是LIKE 'test%'不使用索引的原因。如果在索引创建语句中添加NOCASE子句:

CREATE INDEX dic_word_idx ON dic (word COLLATE NOCASE);

然后LIKE 'test%'将开始使用此索引。但是,在存储和比较单词时,您必须使用一致的大小写 - 例如,始终存储小写,并且在搜索之前始终折叠为小写。

除此之外,您还应该更改数据库架构。目前,您的表行非常宽 - 大至1 MB。

相反,将其拆分为两个表:一个只包含单词的相对较小的表,另一个包含完整文章的从表。我希望你的单词表不会超过原始表的1%,因此即使需要全扫描也会更快阅读。

答案 3 :(得分:0)

GLOB operator区分大小写,因此如果您使用GLOB 'test*'而不是LIKE 'test%',SQLite将能够使用您的索引。

答案 4 :(得分:0)

还可以选择使用SQLite FTS扩展创建全文可搜索表,请参阅here: Storing and Searching for Data