2017-01-06 7 views
0

私はLIKEオペレータに問題があります。私は、そのです例えばのようなもので検索クエリを作成し、私はストリート34を検索:複数のLIKEとANDで "AND"

WHERE address LIKE '%Street%' AND address LIKE '%34%' 

問題は、私が書いている場合は、あまりにも長いアドレスMySQLのクエリがダウンおかしく遅くなるということです。可能な高速ソリューションはありますか?私はオペレータREGEXPまたはINがあることを知っていますが、彼らはORを使用して検索しますが、私はANDで検索する必要があります。

ps:なぜ私は複数のLIKEを書いていますか?なぜなら、「ストリート34」ではなく「34ストリート」というメッセージがあるからです。

+1

あなたのテーブルは適切にインデックスされていますか? –

+1

私は同じようにBTREEで索引付けされました。私はFULLTEXTを索引付けしていましたが、単語でしか検索できませんでしたが、私の場合はそれぞれの文字を検索する方が良いでしょう。最小文字は3から始まります –

+0

LIKEオペランドが**%**で始まる場合、MySqlはINDEXを使用しません。あなたのクエリは** FULL TABLE SCAN **であり、@Romans Leonovsが書いたものを参照してください –

答えて

0

idフィールドとvarcharフィールドがある検索テーブルを追加します。

すべてのユニークな単語を入れます。

単語をそのアドレスにリンクするリンクテーブルを作成します。

テーブルテーブル

Street_id word_id 
    1.    1 
    1.    2 
    2.    3 
    2.    4 
    2.    5 
    2.    1 

をリンク

Id address 
1 34 bakersfield 
2 steve irwing street 34 

表の言葉

Id word 
    1 34 
    2 bakersfield 
    3 steve 
    4 Irwing 
    5 Street 

が次にあなたがしなければならないすべてはどこで、参加する住所が。

クエリのwhereを使用することもできます。

また、画面の背後では同じですが、より優れた全文索引付けを有効にすることもできます。

0

LIKE "%term%"はインデックスの恩恵を受けることはできません。つまり、データベースをフルテーブルスキャンすることになります。あなたが気づいたように、これはかなり遅いです。

あなたはMySQLの全文検索を見ましたか? myisamエンジンを使用している場合、これによりかなり高速化されます:http://dev.mysql.com/doc/refman/5.7/en/fulltext-search.html

+0

はい、全文索引をチェックしています。その作品は速く、同じアドレス検索で動作します。私は多くのアドレスとdatabseを持っていると私のポイントは、ユーザーがアドレスを検索できるシステムを作ることです。フルテキストインデックスの問題についてクライアントは完全にいくつかのアドレス名を知ることができないかもしれません。たとえば、彼は都市名のKarsを書いていますが、彼はそれを終わらせる方法を知らない。彼はストリートストリートのnrとcityを書くつもりのような多くの変数がありますが、データベースストリングはそれをcity street streen nrとして保存します。私は上記のsmtを取るGoogleのような検索をしようとしている –

関連する問題