在android上搜索大型sqlite数据库

在android上搜索大型sqlite数据库,android,database,sqlite,dictionary,cursor,Android,Database,Sqlite,Dictionary,Cursor,你好 我有一个有500000条记录的数据库。 要像在字典上搜索单词一样在数据库中搜索。 我使用以下查询: SELECT id,word FROM dic WHERE word like 'test%' LIMIT 10 CREATE TABLE [dic] ( [id] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, [word] TEXT(100) NOT NULL, [mean] TEXT(1000000) NULL, [pron] TEXT(

你好
我有一个有500000条记录的数据库。
要像在字典上搜索单词一样在数据库中搜索。
我使用以下查询:

SELECT id,word FROM dic WHERE word like 'test%' LIMIT 10
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
);
但是搜索速度很慢,索引词字段和字段在数据库中是ASC顺序
无法在大型数据库中搜索?
示例:

当输入的文本是“Hel”时,我就知道数据库中的单词是以“Hel”开头的。
数据库创建sql代码:

SELECT id,word FROM dic WHERE word like 'test%' LIMIT 10
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
);

尝试使用glob而不是like,我发现在某些情况下,like查询通常不使用索引,因此sqlite正在执行表扫描。但是,您可以通过将索引设置为范围条件来说服sqlite使用索引,如下所示:

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

请注意,在SQLite中,“test”<“testa”和“{”>“z”

,操作符
LIKE
默认不区分大小写,这就是为什么
LIKE“test%”
不使用索引的原因。如果在索引创建语句中添加
NOCASE
子句:

CREATE INDEX dic_word_idx ON dic (word COLLATE NOCASE);
然后,像“test%”这样的
将开始使用此索引。但是,在存储和比较单词时,您必须使用一致的大小写-例如,始终存储小写,并且在搜索之前始终折叠到小写

除此之外,您还应该更改您的数据库模式。目前,您的表有非常宽的行—高达1MB


相反,将其分为两个表:一个相对较小的表只包含word,另一个从表包含完整的文章。我希望您的word表将少于原始表的1%,因此即使需要进行完全扫描,读取速度也会更快。

该表区分大小写,因此如果使用
GLOB'test*”
SQLite将能够使用您的索引,而不是像“test%”这样的

还有一个使用SQLite FTS扩展创建全文搜索表的选项,请参见

顺便说一句:500K行不是很大。甚至没有关闭…您还没有显示架构、查询或您创建的索引。500000对于移动系统来说是很大的!请确保我理解:你建议
{
,因为它的字符代码高于我们期望看到的任何字母数字值?正确;在回答中澄清了这一点。“test”将始终小于test+任何字符,{跟在z后面。