2009-04-29 47 views
2

有谁知道最流行数据库的SQL LIKE运算符的复杂程度是多少?SQL`LIKE`复杂性

+0

请说明您的意思是“复杂性”。 – 2009-04-29 11:52:30

+0

对不起,我是在问这个朋友,他的意思是大O,但这就是我所知道的。 – GhassanPL 2009-04-29 18:56:07

回答

10

让我们分别考虑三个核心案例。这个讨论是针对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%',对此没有任何捷径。如果没有其他限制条件将行数减少到可行数量,则会导致性能下降。您可能需要考虑全文搜索解决方案,或者其他专业解决方案。

1

取决于RDBMS,数据(以及可能的数据大小),索引以及如何使用LIKE(带或不带前缀通配符)!

你问的问题太笼统了。

+0

是的,我想,但这是一个朋友的问题,他没有告诉我更多。 – GhassanPL 2009-04-29 18:58:10

1

如果你问有关性能的影响:

像的问题是,它会使数据库使用的索引。在Oracle上我认为它不再使用索引(但我仍然在Oracle 9上)。如果通配符只在最后,SqlServer使用索引。我不知道其他数据库。

+0

防止对索引进行随机访问,但肯定不扫描索引(尽管它可能会更改它使用的索引)? – 2009-05-28 00:35:48