2012-01-05 12 views
0

質問MySQL REGEXP検索を改善する方法は?

1. を使用してmysqlのSELECTクエリのパフォーマンスを向上させる方法を教えてください。次のクエリを約0.35秒かかります。ここ

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

よう

表には見えます。

select tweet from tweets where tweet regexp '^[abcdef]{1,4}$'; 
  1. ウィルのインデックスtweetより速くそれを作りますか?もしそうなら、どんなタイプのインデックスを使うべきですか?
  2. 私のテーブルエンジンはInnoDBです。有益になる他のテーブルエンジンはありますか?
+0

wat else want you ?? – diEcho

答えて

3

評価する前に正規表現に対して評価するように結果セットを減らすことをお勧めします。正規表現は、すべての意図と目的のために索引付けすることは不可能です。

私はこのために道を見出す必要があった場合、一般的に検索されるパターンを調べ、挿入時にインデックス可能な方法でマークします。例えば、^[abcdef]{1,4}$式を使ってたくさん検索すると、ブール型の列first4AThruFを作成し、挿入/更新トリガで、正規表現と一致するかどうかに基づいて列をtrueまたはfalseに更新します。私はfirst4AThruF列をインデックス化し、カラムは十分な選択性を持っていた場合、私は、クエリ書くことができます:

select tweet from tweets where first4AThruF = true; 

をし、これはかなりジッピーする必要があります。

他にもフルテキストクエリやLIKE句が考えられますが、上記の場合はうまく動作するとは思えません。あなたが探している検索は、文字列の先頭にある場合

+0

"正規表現は、すべての目的と目的のために、" < - 、はい、この場合のような場合を除いてインデックスできません。正規表現enginは最初の文字がセットの1つにしかならないと判断しますその特定のパターンの場合。これは非常に一般的な正規表現エンジンの最適化であり、私はMySQLがそれを持っていると確信しています。 – fge

+0

あなたはそれを確信していますか?私はそうではありません。これは、ドキュメントや 'regex(7)'のページでは言及されていません。テキスト検索オプティマイザとテーブル検索オプティマイザを橋渡しする必要があり、その複雑さとそれが役に立つかもしれないいくつかのケースを考慮すると、MySQLのコーダが何かをしているのは本当に疑問です。 –

+0

私はかなり確信しています - http://regex.info – fge

1

、あなたはその後、REGEXPで再確認し、高レベルのフィルタとしてLIKEを使用することができます。

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}$'; 

をもかかわらず少し複雑であることのこれはずっと速くなければなりません。

関連する問題