SQL"LIKE"复杂性

Gha*_*nPL 2 sql database complexity-theory sql-like

有谁知道LIKE最流行的数据库的SQL 运算符的复杂性是什么?

Emi*_*l H 11

让我们分别考虑三个核心案例.此讨论是特定于MySQL的,但由于索引通常以类似方式实现,因此也可能适用于其他DBMS.

LIKE 'foo%'如果在索引列上运行,则速度很快.MySQL索引是B树的变体,因此在执行此查询时,它可以简单地将树下降到foo与该前缀对应的节点或具有该前缀的第一个节点,并向前遍历树.所有这一切都非常有效.

LIKE '%foo'无法通过索引加速,并将导致全表扫描.如果您有其他可以使用索引执行的标准,它将只扫描初始过滤后剩余的行.

但是有一个技巧:如果你需要进行后缀匹配 - 例如搜索带扩展名的文件名.foo- 你可以通过添加一个与原始列相同但内容相反的列来实现相同的性能.

ALTER TABLE my_table ADD COLUMN col_reverse VARCHAR (256) NOT NULL;
ALTER TABLE my_table ADD INDEX idx_col_reverse (col_reverse);
UPDATE my_table SET col_reverse = REVERSE(col);
Run Code Online (Sandbox Code Playgroud)

搜索col结尾的行将.foo变为:

SELECT * FROM my_table WHERE col_reverse LIKE 'oof.%'
Run Code Online (Sandbox Code Playgroud)

最后,LIKE '%foo%'没有捷径.如果没有其他限制标准可以将行数减少到可行数,那么它将导致严重的性能损失.您可能需要考虑使用全文搜索解决方案,或其他一些专门的解决方案.

  • "col LIKE'%foo%'"将匹配字段中任何位置的"foo"."col LIKE'foo%'或col_reverse LIKE'oof%'"将仅匹配那些结果的子集(即,字段以"foo"开头或结尾的位置). (3认同)