我有一个包含多个字段的数据库
word_id 鈥� INTEGER PRIMARY_KEY word 鈥� TEXT ...
..和约15万行。
由于这是一本字典,因此我正在'search_string%'使用LIKE搜索带有遮罩的单词。过去工作得很好,需要15毫秒才能找到匹配的行。该表具有字段的索引'word'。最近,我修改了表(该表的某些字段超出了范围),并且发生了一些事情- 花费了400毫秒来执行查询,因此我了解到它现在无法使用索引。用=而不是like进行直接查询将显示10ms结果。有人知道这里发生了什么吗?
'search_string%'
'word'
在这种情况下,不能安全地使用索引。天真的实现将改变这一点:
... WHERE word LIKE 'search_string%'
进入
... WHERE word >= 'search_string' AND word < 'search_strinh'
通过增加搜索字符串的最后一个字符。大于和小于运算符可以使用LIKE不能使用的索引。
不幸的是,在一般情况下这是行不通的。该LIKE运营商是不区分大小写的,这意味着'a' LIKE 'A'是真实的。上面的转换将破坏任何用大写字母的搜索字符串。
LIKE
'a' LIKE 'A'
但是,在某些情况下,您 知道 区分大小写与特定列无关紧要,并且上述转换是安全的。在这种情况下,您有两个选择。
NOCASE
PRAGMA case_sensitive_like = ON;
这些行为中的任何一种都将使SQLite可以为您透明地进行上述转换;您只需LIKE像往常一样继续使用,SQLite就会重写基础查询以使用索引。
您可以在“ SQLite查询优化器概述”页面上阅读有关“ LIKE优化”的更多信息。