2011-10-19 10 views
0

私はJavaアプリケーションを持っています。私はテーブルからいくつかのデータを取得してアプリケーションに表示したいと思います。mysqlクエリが最後のレコードに移動するときに遅い

私は何百万ものレコードを持っています。最後のレコードに行くと、クエリは実際には遅くなります。結果を得るには数分もかかりません。

select Id from Table1x where description like '%error%' and Id between 0 and 1329999 limit 0, 1000 

上記のクエリは高速な結果を返します。それは最初のページが速く戻ることです。しかし、私が最後のページを移動しているとき、それは遅くなります。

select Id from Table1x where description like '%error%' and Id between 0 and 1329999 limit 644000, 1000. 

このクエリは遅く、17秒かかります。

これをより速くするためのアイデアはありますか? Idはtable1xの主キーです。

+0

[なぜMYSQLの上位LIMITがクエリを遅らせるのですか?](http://stackoverflow.com/questions/4481388/why-does-mysql-higher-limit-offset-slow-the-query-ダウン) –

答えて

1

問題は同様です。最初の1000個のレコードを取得するには、データベースは検索に一致する1000個のレコードが見つかるまでデータベースをフィルタリングするだけです。もう一方のクエリでは、レコードが645000レコードになるまでデータベースのレコードを一致させる必要があります。ソートやその他のフィルタリングはないので、IDのインデックスはまったく役に立ちません。

インデックスはdescriptionになりますが、あなたが今のようにワイルドカードで検索を開始した場合は役に立ちません。

2つの解決策があります。

最初のオプションは、説明フィールドにFULLTEXTインデックスを追加することです。これは、LIKEではなくMATCHを使用して単語errorを検索することを可能にします。私はそれがずっと速くなると思うが、インデックスも大きくなり、長期的な最適化についてはわからない。

第2の解決策:明らかにエラーを探しているので(ログテーブルのレポートを作成していると思います)、レコードタイプの列を追加することができます。各レコードに、そのレコードがエラーを保持する場所を示す型(整数のみ)を与えることができます。テーブルを一度更新して新しいレコードと共にタイプを挿入する必要がありますが、クエリが高速になります。

この2番目の解決策は、データと目標についての前提に基づいていることを認めなければなりません。私がそれについて間違っている場合は、追加情報を提供してください、あなたに合った解決策を見つけるかもしれません。

関連する問題