喜
我有一个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
);
答案 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