0

Web アプリケーションなどで、ユーザーが既に登録されていることを確認するにはどうすればよいですか? 100 万人のユーザーのデータベースがあるように。データベース内のすべての行を毎回比較するのは非効率的です。他に最適なアプローチはありますか?

4

2 に答える 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 に答える