2

本番サーバーでこの問題が発生しています。アプリケーションスタックは、

  • Tomcat 6.0.18 上の Java Web アプリケーション
  • iBatis データ アクセス レイヤー
  • MySQL 5.0 データベース
  • CentOS

システムは、約 256 MB のメモリを持つ仮想サーバーにデプロイされます。

本当の問題:

のようなクエリ、

select * from customer

約 10 秒で実行されますが、次のクエリを実行すると、

select * from customer where code like '%a%'

上記のクエリを実行した直後に、システムは無期限の処理に入り、最終的に Tomcat を強制的に再起動します。

テーブル統計: - レコード数: 5000 - 主キー: コード

同じクエリ PHP MyAdmin は約 4 秒で実行されます。

MySQLの問題であると思いますか? これをデバッグするアイデア。現在、詳細なログを有効にしており、調査結果でこの質問を更新し続けますが、データベースの洞察をいただければ幸いです。

4

5 に答える 5

2

最近、実稼働システムの 1 つで、MySQL で同様の問題が発生しました。

上記のコメント投稿者のように、問題はテキスト フィールドでのワイルドカード検索、特に検索の先頭の % です。

先頭の % を下げ、検索クエリにかかる時間を数桁短縮しました (サーバーが 60 秒以上かかる状態から「まったく時間がない」状態まで)。

別の方法としては、検索にフルテキスト インデックスまたは Lucene のようなシステムを使用することです。

于 2009-12-21T06:02:36.467 に答える
0

検索の先頭にある % により、テーブルがインデックスを使用しなくなります。% はワイルドカードであるため、データベース内のすべてのレコードを通過する必要があります。これを、MySQL が実行されているだけでなく Tomcat も実行されているという事実と組み合わせると、事態はさらに悪化します。読み取り用のインデックスをメモリに配置する余地はあまりありません。

そのボックスのメモリ量を増やして、MySQL が必要なメモリ キャッシュを作成できるようにし、クエリを高速に動作させるためのスペースを確保する必要があります。

于 2009-12-24T16:59:26.357 に答える
0

質問では、投稿者は同じクエリが PHP MyAdmin で 4 秒で実行されると述べているため、問題は MySql または % によるインデックスの使用不能ではなく、Tomcat またはデータ アクセス レイヤーにあります。

于 2009-12-24T17:45:03.113 に答える
0

MySQL サーバーが正しくセットアップされていないようです。5000 レコードに 10 秒かかることは許容できないはずです。

Javaコードを介してどのようにデータベースにアクセスしていますか? その場合は、ここで高レベルのロジックを提供してください。db ハンドラを効率的に再利用していない可能性があります。

于 2009-12-21T05:28:05.227 に答える
-1

自動インクリメント プライマリ フィールドを作成して、コードを別の一意のインデックスにしようとしましたか。

以前、特定の環境で主キーとしてのテキストが非常に遅くなるという問題がありました。

于 2009-12-21T05:42:43.023 に答える