小编典典

SQLite:像'searchstr%'应该使用索引吗?

sql

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

word_id 鈥� INTEGER PRIMARY_KEY
word 鈥� TEXT
...

..和约15万行。

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


阅读 155

收藏
2021-04-15

共1个答案

小编典典

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

... 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优化”的更多信息。

2021-04-15