2011-06-08 73 views
0

我有一個LoginID數據庫,可以包含1000個用戶。我們檢查用戶是否存在或不是我做的是我存放我的數據庫的所有登錄ID值轉換成一個ArrayList不是檢查它是否存在,或不使用檢索記錄時使用MySql數據庫的ArrayList性能

代碼:

while(result.next()) 
{ 
    String str = result.getString(1); 
    LoginID_arraylist.add(str); 
} 

if(LoginID_arrayList.contains(loginid) 
{ 
    // if exist --> than another query using loginid 
} 

這是一個很好的實現我想要的結果的方式以及我的替代方案.....如果我的身材進一步增長,它會影響我的表現。 我正在使用MySql和JDBC。

回答

3

請勿使用ArrayListcontains搜索。這有O(n)表現。相反,使用具有O(1)查找的HashSet

但是,更好的辦法是不首先查詢所有行。只需提出您的查詢:

SELECT COUNT(*) FROM users WHERE login_id = ? 

然後看看結果是否爲0。

+0

如果我使用ResultSet result = statement.executequery(「SELECT COUNT(*)FROM users WHERE login_id =?」).....比如果loginid不存在什麼會導致包含.... ?? – RanRag 2011-06-08 21:02:27

+0

@RanRag:如果ID不存在,則爲0; 1個或更多(如果ID列是唯一的,則爲1個)。 – 2011-06-08 21:12:15

1

嘗試使用HashSet而不是ArrayList。

一組不允許重複,並且結構更快查找。

1

該解決方案不能很好地適應極大的數據集,因爲使用contains()仍然有很大的O(N)時間。

您可以輕鬆地將當前loginId傳遞給存儲過程,然後返回一個附加數據集,其中包含第二個條件查詢所需的貨物。

這會爲您節省一筆數據庫之旅,並保存在列表上重複N次,以尋找您可能在查詢內部找到的內容。

1

我會使用一個常規的SQL選擇並檢查是否有任何結果。

SELECT LOGIN_ID.ID FROM LOGIN_ID WHERE ID = 'loginid' 

這樣數據庫可以優化和緩存查詢以及利用列上的任何索引。另外,您只會碰到id列而不是loginID表中的每一列。

+0

如果loginid不存在,上面的語句會返回什麼結果。 – RanRag 2011-06-08 20:59:32

+0

@RanRag它不會返回任何記錄。 – Marcelo 2011-06-08 21:01:20

+0

如果您將上述sql用於您的jdbc調用,並且loginid不存在,那麼您的while循環將永遠不會被調用。你可以抓住這個案件,並據此處理。 – joekarl 2011-06-08 21:04:50

相關問題