2013-08-26 4 views
0

예를 들어 사용자가 이미 등록되어 있는지 확인하는 방법입니다. 웹 응용 프로그램에서? 1 백만 명의 사용자 데이터베이스가 있습니다. 데이터베이스의 모든 단일 행을 비교할 때마다 비효율적입니다. 다른 최적의 접근 방법이 있습니까?사용자가 이미 등록되어 있는지 확인하는 가장 좋은 방법은

+0

예, 다른 이름이나 IP 또는 사용자 이름으로 등록되었을 수 있습니다! 명백한 비교는 사용자 이름 일 뿐이며, 그것이 존재하는지를 검사합니다! –

답변

1

당신은 최적화 할 수 있습니다 query 사람이 등록 할 때, 당신은

+0

예, 이름 또는 IP가 같을 수 있습니다! 확실한 비교는 사용자 이름 또는 전자 메일에만 있으며, 존재 여부를 확인하므로 각 행을 쿼리해야합니다! –

+0

@RachitMishra 당신은 Balusc의 두 번째 예제를 볼 수 있습니다. 정확히 내가 말한 것입니다. 사용자 이름을 저장하고 날씨가 기록을 사용할 수 있는지 확인합니다. –

+1

네 동생, 너와 동의, NTR에 +1. –

8
usename 쿼리 것을 전달하고 이미 등록되어 있는지 확인하거나 할 수없고 우선은 사용자의 고유 한 이름 (또는 고유 매개 변수)를 유지할 수 있습니다

데이터베이스에있는 모든 단일 행을 비교할 때마다 비효율적이다

나는 당신이 SELECT * FROM User으로 자바의 메모리에 전체 DB 테이블의 내용을 운반하고 모든 행 전을 통해 반복하고 있다는 수집 n 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 제약 조건이 있음). 그리고 SQL WHERE 절을 사용해야합니다. 정확히 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 쿼리를 작성할 때 정확히 이후 필터링 자바를 사용하거나 추가 쿼리 당신이 어떤 필요없이, 필요한 정보, 그러면 가장 효율적인 방법이 될 것입니다.

+0

이고 증가 된 검색 성능을 위해 USER 테이블의 USERNAME 열에 인덱스를 두는 것을 잊지 마십시오! – jwenting

+0

@jwenting : 그것은 이미 내 답변에 포함되어 있습니다. – BalusC

+1

대신에'SELECT count (*) ...'를 사용할 수도 있습니다. 내 생각에 ID를 얻는 데 정말로 관심이 없으므로 명확하게 읽습니다. –

관련 문제