SQLite3 REGEXP运算符的性能如何?
为简单起见,假设一个包含单列pattern
和索引
CREATE TABLE `foobar` (`pattern` TEXT);
CREATE UNIQUE INDEX `foobar_index` ON `foobar`(`pattern`);
和像
这样的查询SELECT * FROM `foobar` WHERE `pattern` REGEXP 'foo.*'
我一直在尝试比较和理解来自EXPLAIN
的输出,它似乎与使用LIKE
类似,不同之处在于它将使用regexp进行匹配。但是,我不完全确定如何阅读EXPLAIN
的输出,而且我没有掌握它的性能如何。
我理解与索引WHERE `pattern` = 'foo'
查询相比,它会慢一些,但它是否慢于/类似LIKE
?
答案 0 :(得分:3)
sqlite不会优化WHERE ... REGEXP ...
来使用索引。 x REGEXP y
只是一个函数调用;它相当于regexp(x,y)
。另请注意,并非所有sqlite安装都定义了regexp
函数,因此使用它(或REGEXP
运算符)不是非常便携。另一方面,LIKE
/ GLOB
可以利用前缀查询的索引,前提是some additional conditions are met:
- LIKE或GLOB的右侧必须是字符串文字或绑定到不以通配符开头的字符串文字的参数。
- 通过在左侧使用数字值(而不是字符串或blob),一定不能使LIKE或GLOB运算符成为真。这意味着: LIKE或GLOB运算符的左侧是具有TEXT亲缘关系的索引列的名称,或 右侧模式参数不以减号(“ - ”)或数字开头。 这种约束源于数字不按字典顺序排序的事实。例如:9< 10但'9'> '10'。
- 用于实现LIKE和GLOB的内置函数不得使用sqlite3_create_function()API重载。
- 对于GLOB运算符,必须使用内置的BINARY整理顺序对列进行索引。
- 对于LIKE运算符,如果启用了case_sensitive_like模式,则必须使用BINARY整理顺序对列进行索引,或者如果禁用了case_sensitive_like模式,则必须使用内置的NOCASE整理顺序对列进行索引。
- 如果使用ESCAPE选项,则ESCAPE字符必须为ASCII或UTF-8中的单字节字符。
醇>