2013-08-26 54 views
0

如何找出用戶是否已經註冊,例如:在一個Web應用程序?就像我擁有一百萬用戶的數據庫一樣。每次比較數據庫中的每一行都是低效的。有沒有其他最佳方法?找出用戶是否已經註冊的最佳方式

+0

是的,可能是他註冊了不同的名稱,或IP或用戶名!明顯的比較將僅僅是用戶名,檢查它是否存在! –

回答

1

您可以優化query。你可以保持用戶的唯一用戶名(或你的唯一參數),當有人試圖註冊,您可以傳遞一個usename查詢和檢查已註冊或不

+0

是的,而作爲名稱,或IP,可以是相同的!明顯的比較將僅限於用戶名或電子郵件,檢查是否存在,因此每行都必須被查詢! –

+0

@RachitMishra你可以看到Balusc的第二個例子,這正是我所說的。通過用戶名和檢查天氣記錄是否可用。 –

+1

是的兄弟,我同意你的意見,BTW +1 NTR。 –

8

每一次每一個行數據庫進行比較,是低效

據我瞭解,你被一個SELECT * FROM User牽引整個數據庫表中的內容轉換成Java的內存中,然後每一行,我遍歷n a 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子句。它將返回零或一行,數據庫將盡其最大的努力,通常比上述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!) 
} 

概括地說,只要你正確地使用數據庫索引和編寫SQL查詢,以使其返回正是你需要,沒有任何必要的信息爲使用Java或過濾附加查詢之後,那麼這將是最有效的方法。

+0

,並且不要忘記在USER表的USERNAME列放置索引以提高搜索性能! – jwenting

+0

@jwenting:這已經在我的答案中涵蓋了。 – BalusC

+1

您可能只是使用'SELECT count(*)...',而我認爲它更清晰,因爲您無論如何都不想真正感興趣。 –

相關問題