2010-04-29 154 views
21

有傳言說,這個:性能正則表達式的VS LIKE在MySQL查詢

SELECT * FROM lineage_string where lineage like '%179%' and lineage regexp '(^|/)179(/|$)' 

會比這個速度更快:

SELECT * FROM lineage_string where lineage regexp '(^|/)179(/|$)' 

誰能證實?或者知道一個體面的方式來測試這種查詢的速度。 謝謝

+0

根據這個不太受支持的博客文章,LIKE比REGEXP快10倍(數據可能有所不同,索引使用上沒有任何字詞等):http://thingsilearn.wordpress.com/2008/02/28/mysql-query -speed-regexp-vs-like/ – 2010-04-29 19:14:23

+0

額外的鏈接 - 同樣的故事,LIKE更快:http://lists.mysql.com/mysql/101728 – 2010-04-29 19:16:26

+0

它'TEXT'和'VARCHAR'字段肯定更快我試過了上。我記得在博客評論中看到** REGEXP **對於'UNSIGNED'字段比** LIKE **快,但我無法證實這一點。 – inhan 2012-08-16 03:24:54

回答

21

它可能會更快,因爲可以更快速地評估LIKE條件,然後正則表達式,因此如果大多數行失敗,測試可能會更快。但是,如果大多數行都成功了,那麼它將會變慢,因爲必須爲成功的行而不是僅僅一次運行兩個測試。它也取決於優化器選擇先運行哪個表達式。

一個更大的加速可以,如果你有這樣的事情被目擊:

SELECT * FROM (
    SELECT * FROM lineage_string 
    WHERE lineage LIKE '179%' 
) WHERE lineage regexp '^179(/|$)' 

現在的指數可以用來尋找可能行,因爲LIKE「179%」是sargable。許多行根本不需要檢查。

一如既往,最好的方法就是根據您的實際數據自行測量。

13

是的,它可能會快一點點,因爲標準SQL LIKE比完整正則表達式解析器更簡單的比較操作。

但是,實際上兩者都很慢,因爲它們都不能使用索引。 (LIKE可以使用索引如果匹配字符串不是以一個通配符開始,但這裏並非如此。)

如果您擔心速度,你應該改變你的架構,這樣就可以直接把179在列和索引中,而不必在每一行上手動檢查字符串。