有谁知道最流行的数据库对于SQL LIKE
操作符的复杂性是什么?
最佳答案
让我们分别考虑这三个核心案例。这个讨论是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);
搜索以
col
结尾的.foo
行将变成:SELECT * FROM my_table WHERE col_reverse LIKE 'oof.%'
最后,还有
LIKE '%foo%'
,没有捷径。如果没有其他限制标准将行的数量减少到一个可行的数量,这将导致严重的性能损失。您可能需要考虑使用全文搜索解决方案,或者其他一些专门的解决方案。关于sql - SQL`LIKE`的复杂度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/801984/