有没有人知道最流行的数据库的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(带或不带前缀通配符)!

你问的问题过于笼统。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top