2011-06-08 68 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