SQL“LIKE”复杂性
-
03-07-2019 - |
题
有没有人知道最流行的数据库的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);
搜索以 .foo
结尾的 col
的行,然后变为:
SELECT * FROM my_table WHERE col_reverse LIKE 'oof.%'
最后, LIKE'%foo%'
,没有捷径。如果没有其他限制标准可以将行数减少到可行数字,它会导致严重的性能损失。您可能需要考虑使用全文搜索解决方案,或其他一些专业解决方案。
其他提示
如果您询问性能影响:
类似的问题是它使数据库不使用索引。在Oracle上我认为它不再使用索引(但我仍然在Oracle 9上)。如果通配符仅在结尾处,则SqlServer使用索引。我不知道其他数据库。
取决于RDBMS,数据(以及可能的数据大小),索引以及如何使用LIKE(带或不带前缀通配符)!
你问的问题过于笼统。
不隶属于 StackOverflow