在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后面。