Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 交叉检查用户列表和数据库上的用户-坏主意?_Sql_Ruby On Rails_Database_Postgresql - Fatal编程技术网

Sql 交叉检查用户列表和数据库上的用户-坏主意?

Sql 交叉检查用户列表和数据库上的用户-坏主意?,sql,ruby-on-rails,database,postgresql,Sql,Ruby On Rails,Database,Postgresql,比如说。如果我有1000000个用户在我的系统上注册,我有一个500个名字的列表 我想对照系统上的用户数交叉检查这些名称,以查看哪些名称/用户已经在数据库上注册 这样的过程会显著降低应用程序的速度吗?还是这种事情总是发生 也许我可以每30分钟缓存一次结果,这样我就不必每次都调用它 编辑>>一点澄清: 我忘了提到我正在努力估算500个名字的名单。因此,如果“foobar”和“joe”在这个列表中,并且也在db中注册,那么我要做的就是从列表中删除“foobar”和“joe”,给我498个名字 我认为

比如说。如果我有1000000个用户在我的系统上注册,我有一个500个名字的列表

我想对照系统上的用户数交叉检查这些名称,以查看哪些名称/用户已经在数据库上注册

这样的过程会显著降低应用程序的速度吗?还是这种事情总是发生

也许我可以每30分钟缓存一次结果,这样我就不必每次都调用它

编辑>>一点澄清:

我忘了提到我正在努力估算500个名字的名单。因此,如果“foobar”和“joe”在这个列表中,并且也在db中注册,那么我要做的就是从列表中删除“foobar”和“joe”,给我498个名字

我认为这样做不合适:

User.where('name in (?)', Array('foobar', 'joe'))
User.each do |registered_user|
  index = list.index(list.find{ |user| user.screen_name.downcase == registered_user.screen_name.downcase })
  list.delete_at(index) if index
end

filtered_list = list
我会这样做:

User.where('name in (?)', Array('foobar', 'joe'))
User.each do |registered_user|
  index = list.index(list.find{ |user| user.screen_name.downcase == registered_user.screen_name.downcase })
  list.delete_at(index) if index
end

filtered_list = list

如果表结构正确(唯一键、频繁搜索字段上的索引等),任何值得使用的现代关系数据库都应该能够轻松地对数据库进行500次检查,而不会影响其他查询

只要表的结构正确(唯一键、频繁搜索字段的索引等),任何值得使用的现代关系数据库都应该能够轻松地对数据库进行500次检查,而不会影响其他查询

如果你做得巧妙,它可以非常快。让数据库来完成这项工作

SELECT * FROM USERS WHERE Name IN ( <generated list of your 500 user name candidates>)
从名称位于()的用户中选择*
返回的列表将是数据库中已经存在的500个列表中的一个。比如说调用速度会很快,在数据库上最长几秒钟就慢了

干杯,
丹尼尔

如果你做得聪明,它可能会非常快。让数据库来完成这项工作

SELECT * FROM USERS WHERE Name IN ( <generated list of your 500 user name candidates>)
从名称位于()的用户中选择*
返回的列表将是数据库中已经存在的500个列表中的一个。比如说调用速度会很快,在数据库上最长几秒钟就慢了

干杯,
Daniel

还要确保名称已编入索引。在数据库级还是在应用程序级进行交叉检查更好?最好对数据库进行尽可能少的查询,因为到数据库的往返比在内存中运行代码慢几个数量级。数据库应该能够非常快速地执行此查询,特别是在为name列编制索引时。所以让DB来做这项工作。这是一个简单的查询,几乎不会出错。如果您在代码中生成列表(而不是子查询),请注意以下事项-1)sql注入攻击2)某些数据库对“in”子句的大小有限制,因此,我认为500个条目可能有点冒险,这取决于数据的大小。因此,在使用Oracle时,我会将我的子句分成998个左右的集合。还要确保名称已编入索引。在db级别还是在应用程序级别执行交叉检查更好?最好对数据库进行尽可能少的查询,因为到数据库的往返比在内存中运行代码慢几个数量级。数据库应该能够非常快速地执行此查询,特别是在为name列编制索引时。所以让DB来做这项工作。这是一个简单的查询,几乎不会出错。如果您在代码中生成列表(而不是子查询),请注意以下事项-1)sql注入攻击2)某些数据库对“in”子句的大小有限制,因此,我认为500个条目可能有点冒险,这取决于数据的大小。因此,在使用Oracle时,我将子句分成998个左右的集合。