2016-10-15 12 views
0

私は、常に3つの値を特定の行で検索するクエリを持っています。テーブルに記録が多すぎます。私はフォーラムで、REGEXPが悪い選択であると聞いた。私は混乱しており、より速い検索結果のためのあなたの提案を聞きたいと思います。mySQL - 検索結果を高速化するためにREGEXPを使用する必要がありますか?

SELECT shareit,id FROM shares where from='".$nick."' and shareit 
REGEXP 'youtube|dailymotion|vimeo' ORDER BY id DESC 

答えて

2

これはあなたのクエリです:

SELECT shareit, id 
FROM shares 
WHERE from = '".$nick."' and 
     shareit REGEXP 'youtube|dailymotion|vimeo' 
ORDER BY id DESC; 

正規表現はLIKEから異なる規則に従ってください。だから、あなたのクエリは同等です:

SELECT shareit, id 
FROM shares 
WHERE `from` = '".$nick."' and 
     (shareit LIKE '%yourtube%' OR 
     shareit LIKE '%dailymotion%' OR 
     shareit LIKE '%vimeo%' 
    ) 
ORDER BY id DESC; 

LIKEパターンの先頭にワイルドカードを使用すると、インデックスは、比較のその部分のために使用することができないことを意味します。クエリでは、shares(from)のインデックスを使用できます。

どちらが高速ですか、likeまたはregexpですか?すべての正直なところ、クエリの作業のほとんどは行をフェッチしています。おそらく比較は匹敵します。 1つはもう一方よりも少し速いかもしれませんが、それはわずかな問題です。

あなたは完全一致が必要な場合は、クエリは次のようになります。

SELECT shareit, id 
FROM shares 
WHERE from = '".$nick."' and 
     shareit IN ('youtube', 'dailymotion', 'vimeo') 
ORDER BY id DESC; 

このクエリの場合、shares(from, shareit)のインデックスは間違いREGEXPバージョンよりも優れています。

+0

FULLTEXTインデックスを使用すると、LIKEを使用してクエリを高速化できますか? –

+0

@DaveThomas。 。 。テキスト内で「単語」を探している場合のみ。単語は適切な区切り文字で区切られなければならない。 'from'のインデックスでは、フルテキストインデックスが本当に役立つだろうとはっきりしていません。 –

+0

申し訳ありません。私はshareitのフルテキストインデックスを意味していました。もし理論的にshareitがテキストの段落だったら。それは完全なテキストではないことから、それと別のインデックスがありますか?そのように2つの別々のインデックスが使用されているかどうかは不明です。 –

2

REGEXPマッチングは常に直接等価比較よりも遅くなります。たとえば、mysqlの正規表現解析を構成するコードの量を取ってみましょう。MySQL Open Source Regex Code

正規表現を実行するために必要なことを見て、このように操作することの複雑さを考慮してください。追加の参照:https://softwareengineering.stackexchange.com/questions/122440/how-do-regular-expressions-actually-work

直接的な等価比較を行う代わりに、より多くの最適化を行うことができ、操作のコストを抑えることができます。

正規表現はどのくらい遅いですか?それは主観的です。いくつかのベンチマークを実行し、あなたに合ったソリューションを選択することができます。正規表現の複雑さが必要な場合や、費用が無視できる場合もあります。私の意見で

あなたが完全に一致する予定がある場合、余分なタイピングを行い、そして一緒に行く:

SELECT shareit,id FROM shares where from='".$nick."' and 
(shareit = 'youtube' OR shareit = 'dailymotion' OR shareit = 'vimeo') 
ORDER BY id DESC 

あなたが完全に一致を探してされていない場合は、その後の使用にのようなクエリを使用ゴードン・リノフの答え。注目すべき重要な点として、比較している列のインデックスは、パフォーマンス向上のための最適なオプションになります。

関連する問題