有谁知道LIKE
最流行数据库的 SQL 运算符的复杂性是什么?
3 回答
让我们分别考虑三个核心案例。这个讨论是特定于 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);
搜索以thencol
结尾的行.foo
变成:
SELECT * FROM my_table WHERE col_reverse LIKE 'oof.%'
最后,还有LIKE '%foo%'
,没有捷径。如果没有其他限制标准可以将行数减少到可行的数量,则会导致严重的性能损失。您可能需要考虑使用全文搜索解决方案,或者其他一些专门的解决方案。
取决于 RDBMS、数据(可能还有数据的大小)、索引以及 LIKE 的使用方式(带或不带前缀通配符)!
你问的问题太笼统了。
如果您询问性能影响:
like 的问题是它使数据库无法使用索引。在 Oracle 上,我认为它不再使用索引(但我仍在使用 Oracle 9)。如果通配符仅在末尾,则 SqlServer 使用索引。我不知道其他数据库。