2


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

5 回答 5

3

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

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

注意 "test" < "testa" 和 "{" > "z"

于 2013-07-28T01:47:49.243 回答
0

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

CREATE INDEX dic_word_idx ON dic (word COLLATE NOCASE);

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

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

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

于 2013-07-28T02:40:33.113 回答
0

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

于 2013-07-28T01:25:17.597 回答
0

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

于 2013-07-28T08:54:49.880 回答
0

还有一个使用 SQLite FTS 扩展创建全文可搜索表的选项,请参见此处:存储和搜索数据

于 2013-07-29T09:50:17.610 回答