26

我有一个包含多个字段的数据库

word_id — INTEGER PRIMARY_KEY
word — TEXT
...

..和 ~150k 行。

'search_string%'由于这是一本字典,我正在使用 LIKE搜索带有掩码的单词。它过去工作得很好,需要 15 毫秒才能找到匹配的行。该表有一个字段的索引'word'。最近我修改了表(该表的某些字段超出了范围)并且发生了一些事情 - 执行查询需要 400 毫秒,所以我理解它现在无法使用索引。使用 = 而不是 like 的直接查询显示 10 毫秒的结果。有人知道这里发生了什么吗?

4

1 回答 1

37

在这种情况下不能安全地使用索引。一个天真的实现会改变这一点:

... WHERE word LIKE 'search_string%'

进入

... WHERE word >= 'search_string' AND word < 'search_strinh'

通过增加搜索字符串的最后一个字符。大于和小于运算符可以使用索引,而 LIKE 不能。

不幸的是,这在一般情况下不起作用。LIKE运算符不区分大小写,这意味着它是'a' LIKE 'A'正确的。上述转换将破坏任何带有大写字母的搜索字符串。

但是,在某些情况下,您知道区分大小写与特定列无关,并且上述转换是安全的。在这种情况下,您有两个选择。

  1. NOCASE对涵盖此特定字段的索引使用整理顺序。
  2. 通过运行更改LIKE操作员程序范围内的行为PRAGMA case_sensitive_like = ON;

这些行为中的任何一个都将使 SQLite 透明地为您执行上述转换;您只需LIKE像往常一样继续使用,SQLite 将重写底层查询以使用索引。

您可以在SQLite 查询优化器概述页面上阅读有关“LIKE 优化”的更多信息。

于 2011-12-21T07:31:07.403 回答