sqlite LIKE 'searchstr%'应该使用索引吗?

w6lpcovy  于 2023-06-23  发布在  SQLite
关注(0)|答案(2)|浏览(145)

我有一个数据库,有几个字段:

word_id — INTEGER PRIMARY_KEY
word — TEXT
...

和~ 150 k行。因为这是一本字典,所以我使用LIKE搜索掩码'search_string%'的单词。它曾经工作过,需要15毫秒才能找到匹配的行。该表具有字段'word'的索引。
我修改了表(一些超出范围的字段),执行查询需要400毫秒,所以我理解,因为它现在无法使用索引。使用=而不是LIKE的直接查询显示10 ms的结果。这是怎么回事

uqjltbpv

uqjltbpv1#

在这种情况下不能安全地使用索引。一个简单的实现将改变这一点:
... WHERE word LIKE 'search_string%'
进入
... WHERE word >= 'search_string' AND word < 'search_strinh'
通过递增搜索字符串的最后一个字符。大于和小于运算符可以使用索引,LIKE不能使用索引。
不幸的是,这在一般情况下是行不通的。LIKE运算符不区分大小写,这意味着'a' LIKE 'A'为真。上面的转换将破坏任何带有大写字母的搜索字符串。
但是,在某些情况下,您知道区分大小写与特定列无关,并且上述转换是安全的。在这种情况下,您有两个选择。
1.在覆盖此特定字段的索引上使用NOCASE排序序列。
1.通过运行PRAGMA case_sensitive_like = ON;在程序范围内更改LIKE运算符的行为
这两种行为中的任何一种都将使SQLite能够透明地为您完成上述转换;您只需一如既往地使用LIKE,SQLite将重写底层查询以使用索引。
您可以在SQLite查询优化器概述页面上阅读更多关于“LIKE优化”的信息。

2g32fytz

2g32fytz2#

GLOB prefix*变通方法

这个方法确实使用了索引,因此对于LIKE prefix%来说,这是一个很好的解决方法,不需要修改表排序规则:

SELECT * FROM mytable WHERE mycolumn GLOB 'myprefix*'

标签:Can an index on a text column speed up prefix based LIKE queries?
在Sqlite 3.40.1,Ubuntu 23.04上测试了一个TEXT列的大型数据库,我有750 M行。查询结果几乎是即时的。

相关问题