mysql-connector v5.1.30を使用してローカルJavaアプリケーションを実行しているときに、MySQL(v5.5)でパフォーマンスの問題が発生します
AとBという2つのテーブルがあります。次のように実行します。
PreparedStatement stmtA = conn.prepareStatement("select x, y, z, u, v, w from A");
PreparedStatement stmtB = conn.prepareStatement("select val from B where something = ?");
ResultSet result = stmtA.executeQuery();
while ( resultA.next() ){
// do something with result row
if (some condition) { // true approx. 80% of the time
ResultSet resultB = stmtB.executeQuery(some_value_from_resultA);
// do something with result row
resultB.close();
}
}
stmtA.close();
問題は、これが毎回完了するのに最大12分かかることです。関連する情報をいくつか示します。
mysqld
プロセスでは、12分間で95〜99%のCPUを使用しています。mysqlプロセスのCPU使用率がおかしいという事実は別として、問題があると思う理由は、アプリケーションに、別のデータベーステーブルに対してほぼ同じメソッドを実行する追加機能があるためです。このテーブルの列数はテーブルA(これもMYISAMを使用)と同じですが、大きな違いの1つは、ここにテーブルBがないことです。したがって、上記と同じように機能しますが、最初のテーブルの行を反復するときに2番目のテーブルをクエリする必要はありません。
この他のテーブルには4,500行があり、反復には1秒もかかりません。
したがって、テーブルBのネストされたクエリが問題を引き起こしているように見えますが、よくわかりません。MySQLの経験は限られています。さらに情報が必要な場合は、お問い合わせください。
テーブルBで実行したクエリの結果をプリロードまたはキャッシュすることをお勧めします。テーブルBには多くのレコードがないため、マップにロードする余裕があります。
2つのオプションがあります:
something
は、多くの一意の値があり、Bクエリがそれらの多くを検索する場合に最も効果的です。something
Bクエリで値の小さなサブセットのみを使用する場合は、メモリの点でより効率的です。テーブルBにインデックスを追加することも役立ちます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加