6

これは、過去数日間、私の頭の痛みでした。以前、のパフォーマンスに関する知識がなくてもデータベースを作成しましたLIKE。私が使用したクエリは次のようなものです。

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

クエリをテストしたところ、100〜150のレコードしかなかったため、非常に高速でした。キーワードを含む文字列を検索したかったのです。数か月が経過すると、データベースは50,000レコードを含む巨大なものになりました。そして今回、私はすでにクエリのパフォーマンスの低下を経験しています。非常に低かった。

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

ちなみに、私のテーブルはすべてINNODBでした。

4

3 に答える 3

1

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

インデックスなし=全表スキャン=(通常)遅い...

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

MySqlの全文検索関数の使用を検討しましたか?(MyISAMテーブルが必要です)

于 2012-10-29T00:04:13.353 に答える
1

このタイプの検索は全文検索と呼ばれ、データベースに常にテーブルスキャンを実行させるのではなく、専用のシステムを使用する必要があります。基本的に、検索するすべてのテキストを検索エンジンに渡します。検索エンジンは、すばやく検索できるようにインデックスを作成します。

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

于 2012-10-29T00:11:29.140 に答える
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 ...

重要なのは、参加する前に結果セットを絞り込むことです。

于 2012-10-29T06:04:25.933 に答える