2012-10-29 19 views
6

これは過去数日間の私の頭の痛みでした。私はLIKEのパフォーマンスについて知らずにデータベースを作成しました。私が使用したクエリは、その上にわずか約100〜150の記録があったので、私は、クエリをテストし LIKE句のパフォーマンスを改善します

SELECT .... 
FROM .... JOINS .... 
WHERE tableA.col1 LIKE '%keyword%' OR 
     tableB.col2 LIKE '%keyword%' OR 
     tableC.col2 LIKE '%keyword%' OR 
     ..... 

が、それは非常に速かった、このようなものです。キーワードが入っている文字列を検索したかったのです。過去数ヶ月の間に、データベースは膨大になり、5万レコードを記録しました。そして、今回は、すでにクエリのパフォーマンスが低いことがあります。それは非常に低かった。

私はどのように改善することができますか?私はすでに企業ですでに使用されているので、データベースを変更することはできません。

ところで、私のテーブルはすべてINNODBでした。

+0

これは完全なテーブルスキャンです...外部検索エンジンはどうですか? –

+0

このような遅いクエリを避けるために、テーブルレイアウトを変更する必要があるかもしれません。 – Jocelyn

+0

こんにちは@KarolyHorvath。外部の検索エンジンはどういう意味ですか? –

答えて

1

このタイプの検索はFull Text Searchとなります。データベースに常にテーブルスキャンを行わせるのではなく、特殊なシステムを使用する必要があります。検索したいすべてのテキストを検索エンジンに渡すと、そのテキストが検索されます。

1つのオプションはApache Luceneです。

+0

+1、または別のオプションで変更されます:http://sphinxsearch.com/about/sphinx/ –

+0

現在のシナリオではどのように適用されますか?私は自分のデータベースの構造や何を変更する必要がありますか?私は大いにこの必要があります:( – SkyDrive

+0

@DerekFloss Np​​、あなたは現在のデータベースだけを残します。代わりに、Luceneのようなフルテキスト検索を処理する新しいソフトウェアtpをインストールします。 Luceneに検索したいテキストを入力し、既存のコードを変更してこれらの検索にLuceneを使用してください。 –

1

ワイルドカードプレフィックス'%abc'を使用すると、使用されているインデックスがすべて停止する可能性が非常に高くなります。

ませインデックス=全表スキャン=(通常は)遅い...

ところで、50,000レコードは巨大ではありません。それは小さいです。

MySqlのFull-Text Search Functionsを使用したことがありますか? (MyISAMテーブルが必要)

+1

フルテキストインデックスはMyISAMテーブルでのみ使用できます –

+0

ありがとうございます。回答を更新しました。 –

+0

fulltextは 'INNODB'をサポートしませんか? – SkyDrive

0

他の友人が述べたように、あなたが全文検索を使用することができない場合は、あなたのクエリを向上させることができ、SQLの最適化のポイントがあります:

SELECT .... 
FROM (SELECT * FROM tableA WHERE col1 LIKE '%keyword%') A JOIN 
     (SELECT * FROM tableB WHERE col2 LIKE '%keyword%') B ON ... JOIN 
     (SELECT * FROM tableC WHERE col2 LIKE '%keyword%') C ON ... 

ポイントが前の任意の参加にごResultSetを絞り込むことです。

関連する問題