Web アプリケーションなどで、ユーザーが既に登録されていることを確認するにはどうすればよいですか? 100 万人のユーザーのデータベースがあるように。データベース内のすべての行を毎回比較するのは非効率的です。他に最適なアプローチはありますか?
質問する
1422 次
2 に答える
8
データベース内のすべての行を毎回比較するのは非効率的です
DB テーブルの内容全体を Java のメモリに取り込み、ループSELECT * FROM User
内のすべての行をループして、以下のようwhile
にユーザー名を比較してequals()
いると思いますが、本当ですか?
public boolean exists(String username) throws SQLException {
// ... Declare, etc.
statement = connection.prepareStatement("SELECT * FROM User");
resultSet = statement.executeQuery();
while (resultSet.next()) {
if (username.equals(resultSet.getString("username"))) {
return true;
}
}
return false;
// ... Close, etc (in finally!)
}
それは確かに非常に非効率的です。ユーザー名列にインデックスを付けて(おそらくすでにUNIQUE
制約付きで)、SQLWHERE
句を使用する必要があります。正確に 0 行または 1 行を返し、DB はそれを見つけるために最善を尽くします。これは通常、上記の Java アプローチよりもはるかに高速です。
public boolean exists(String username) throws SQLException {
// ... Declare, etc.
statement = connection.prepareStatement("SELECT id FROM User WHERE username = ?");
statement.setString(1, username);
resultSet = statement.executeQuery();
return resultSet.next();
// ... Close, etc (in finally!)
}
一言で言えば、DB インデックスを適切に使用し、必要な情報を正確に返すように SQL クエリを記述している限り、後で Java を使用したフィルタリングや追加のクエリを行う必要がなく、最も効率的な方法です。
于 2013-08-26T11:22:47.417 に答える
1
最適化できますquery
。ユーザーの一意のユーザー名(または一意のパラメーター)を維持できます。誰かが登録しようとすると、それusename
をクエリに渡して、すでに登録されているかどうかを確認できます
于 2013-08-26T11:16:05.350 に答える