2012-01-05 50 views
0

問題是,如何提高MySQL REGEXP搜索?

1.如何在使用REGEXP的mysql中提高SELECT查詢的性能?

表看起來像

create table `tweets`(
    `id` bigint auto_increment, 
    `tweet` varchar(140), 
    `time` datetime, 
    primary key(`id`) 
); 

這裏下面的查詢需要大約0.35秒

select tweet from tweets where tweet regexp '^[abcdef]{1,4}$'; 
  1. 威爾索引tweet使其更快?如果是這樣,我應該使用什麼類型的索引?
  2. 我的表引擎是InnoDB,有沒有其他的表引擎會變得有益?
+0

其他你想要的? – diEcho 2012-01-05 19:09:39

回答

3

最好的辦法是在評估前減少結果集以評估正則表達式。對於所有意圖和目的而言,正則表達式無法進行索引。

如果我必須想出一個辦法,我會研究通常搜索的模式,並在插入時以某種索引方式標記它們。例如,如果使用^[abcdef]{1,4}$表達式進行大量搜索,我會創建一個布爾型列first4AThruF,並在插入/更新觸發器上根據它是否與正則表達式匹配將列更新爲true或false。如果我索引的first4AThruF列,列有足夠的選擇性,我可以寫查詢:

select tweet from tweets where first4AThruF = true; 

,這應該是相當活潑。

其他可能的考慮是全文查詢或LIKE子句,雖然在上面提到的情況下,我不指望它們工作的很好。

+0

「對於所有的意圖和目的,正則表達式都是不可能索引的」< - 好吧,是的,除非在這種情況下,正則表達式確定第一個字符只能是一個集合中的一個,這是與特定模式的情況。這是一個非常常見的正則表達式引擎優化,我相信MySQL有這個。 – fge 2012-01-05 21:26:58

+0

你確定嗎?我不會。它肯定沒有在文檔或'regex(7)'頁面中提到。您需要將文本搜索優化器與表搜索優化器連接起來,並考慮到這種情況的複雜性以及少數可能有用的情況,我真的懷疑MySQL中的編碼器是否做過類似的事情。 – 2012-01-05 21:49:51

+0

我很確定 - http://regex.info – fge 2012-01-05 22:04:13

1

如果你正在尋找搜索是一個字符串的開始,你可以像使用作爲高層次的過濾器,然後用REGEXP再次檢查:

select tweet from tweets 
where 
    ( 
     tweet LIKE 'a%' OR 
     tweet LIKE 'b%' OR 
     tweet LIKE 'c%' OR 
     tweet LIKE 'd%' OR 
     tweet LIKE 'e%' 
    ) 
    AND LENGTH(tweet) <= 4 -- try taking this line out line too 
    AND tweet regexp '^[abcdef]{1,4}$'; 

儘管是一個有點令人費解,這應該快很多。