【问题标题】:search on huge sqlite database on android在 android 上搜索巨大的 sqlite 数据库
【发布时间】:2013-07-28 01:29:16
【问题描述】:


我有一个包含 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
);

【问题讨论】:

  • 顺便说一句:500K 行并不大。甚至没有关闭...您还没有显示架构、查询或您创建的索引。
  • 500,000 对于移动系统来说是巨大的!

标签: android database sqlite dictionary cursor


【解决方案1】:

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

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

注意 "test" "z"

【讨论】:

  • 确保我理解:您建议{,因为它的字符代码高于我们期望看到的任何字母数字值?
  • 正确;在回复中澄清了这一点。 "test" 总是小于 test + 任何字符,并且 { 跟在 z 后面。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    CREATE INDEX dic_word_idx ON dic (word COLLATE NOCASE);
    

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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        还有一个使用 SQLite FTS 扩展创建全文可搜索表的选项,请参阅here: Storing and Searching for Data

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-12-31
          • 2010-11-03
          • 2015-12-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-19
          • 2022-01-23
          相关资源
          最近更新 更多