2009-04-29 79 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