Mysql 在查询中优化rails以获得数百万个阵列ID
希望获得在特定帐户及其各自的出口注册的用户 用户和插座型号没有任何关联 门店拥有且属于多个账户,反之亦然 用户包含字段outlet_代码,该代码在outlet表中是唯一的 @account=account.find(2546)Mysql 在查询中优化rails以获得数百万个阵列ID,mysql,ruby-on-rails,ruby,ruby-on-rails-4,Mysql,Ruby On Rails,Ruby,Ruby On Rails 4,希望获得在特定帐户及其各自的出口注册的用户 用户和插座型号没有任何关联 门店拥有且属于多个账户,反之亦然 用户包含字段outlet_代码,该代码在outlet表中是唯一的 @account=account.find(2546) @outlet_id=@account.outlets.map(&:id)#----它返回如下数组[1,2,3…1032457],这是一个动态数组 我使用的这个查询效率不高=>@users=User。其中(:outlet\u code=>@outlet\u id)我认为您
@outlet_id=@account.outlets.map(&:id)#----它返回如下数组[1,2,3…1032457],这是一个动态数组
我使用的这个查询效率不高=>@users=User。其中(:outlet\u code=>@outlet\u id)我认为您需要的是延迟加载和批量处理 在您的案例中,最有效的方法(假设您以任何方式处理收集)是使用: 将返回惰性枚举器的实例:
#<Enumerator::Lazy: ...>
#
现在您可以直接使用它并迭代-
@users
将根据需要从数据库中加载(延迟)。使用find\u和批大小:-
@users = User.where(:id => [1,2,3....450000]).find_each(batch_size: 50 or no. of records you want to get in batch)
我将返回以下记录:-
#<Enumerator: #<ActiveRecord::Relation [...]>
你能描述一下你想要实现什么,为什么你有一个100万ID的数组?这个ID是如何计算的??你能把它放在这里吗details@outlet_ids=@account.outlets.map(&:id)#----它返回计数超过10个lac记录的特定帐户的所有出口id显示确切地说,与已经给出的答案相比,这个答案是新的?谢谢,但是使用批大小和使用ajax调用查找每个帐户的概念,响应超时,因为返回结果花费了太多时间。此外,我在从上游客户端读取响应标头时,使用批处理2015/12/05 07:29:05[error]上游过早关闭连接时出现此错误。我使用了这个NGINX&MySql。
#<Enumerator: #<ActiveRecord::Relation [...]>
@users = User.where(:id => [1,2,3....450000]).find_each(batch_size: 50 ) do |user|
# your code here
end
# User Load (0.7ms) SELECT "users".* FROM "users"
# ORDER BY "users"."id" ASC LIMIT 50
# User Load (0.6ms) SELECT "users".* FROM "users"
# WHERE ("users"."id" > 50) ORDER BY "users"."id" ASC LIMIT 50
# USer Load (0.3ms) SELECT "users".* FROM "users"
# WHERE ("users"."id" > 100) ORDER BY "users"."id" ASC LIMIT 50