在这种情况下不能安全地使用索引。一个简单的实现将改变这一点: ... 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优化”的信息。
2条答案
按热度按时间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优化”的信息。
2g32fytz2#
GLOB prefix*
变通方法这个方法确实使用了索引,因此对于
LIKE prefix%
来说,这是一个很好的解决方法,不需要修改表排序规则:标签:Can an index on a text column speed up prefix based LIKE queries?
在Sqlite 3.40.1,Ubuntu 23.04上测试了一个
TEXT
列的大型数据库,我有750 M行。查询结果几乎是即时的。