Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.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
Ruby on rails 通过减少迭代次数和数据库命中率重构代码_Ruby On Rails_Ruby_Devise - Fatal编程技术网

Ruby on rails 通过减少迭代次数和数据库命中率重构代码

Ruby on rails 通过减少迭代次数和数据库命中率重构代码,ruby-on-rails,ruby,devise,Ruby On Rails,Ruby,Devise,我有一个私有实例用户模型方法,如下所示:- def generate_authentication_token loop do token = Devise.friendly_token break token unless self.class.unscoped.where(authentication_token: token).first end end 让我们假设,用户记录的数量是100万亿。如果我发出上面的脚本,并且每次迭代生成的令牌与记录匹配,那么循

我有一个私有实例用户模型方法,如下所示:-

def generate_authentication_token
  loop do
    token = Devise.friendly_token
    break token unless self.class.unscoped.where(authentication_token:   token).first
  end
end  

让我们假设,用户记录的数量是100万亿。如果我发出上面的脚本,并且每次迭代生成的令牌与记录匹配,那么循环将迭代100万亿次,对于搜索记录的DBMS也会发生同样的情况。是否有任何解决方案可以通过减少迭代和减少db命中率(假设每次迭代都会给出匹配的记录)来快速解决此问题。说真的,对不起!如果这个问题没有意义,让我知道,我会尽快删除。谢谢快乐编码

代码看起来不错<代码>查找方式(身份验证令牌:令牌)通常是检索单个记录的首选方式

确保为
身份验证\u令牌
列添加索引。如果您有许多记录,这将大大加快查询速度。如果您不了解数据库索引,请参阅答案


我不担心优化迭代次数或db命中次数,因为即使在第一次尝试时也能找到匹配标记的可能性很小。

代码看起来不错<代码>查找方式(身份验证令牌:令牌)通常是检索单个记录的首选方式

确保为
身份验证\u令牌
列添加索引。如果您有许多记录,这将大大加快查询速度。如果您不了解数据库索引,请参阅答案


我不担心优化迭代次数或db命中次数,因为即使在第一次尝试时也能找到匹配标记的可能性很小。

为什么要使用这样的方法


token=Digest::MD5.hexdigest(rand.to_s为什么要使用这样的东西


token=Digest::MD5.hexdigest(rand.to_s您希望创建一个随机但唯一的令牌。对我来说,这听起来像UUID。您可以试试


你的方法会奏效,但对你瞄准的100万亿用户来说效率很低:-)

你想创建一个随机但唯一的令牌。对我来说听起来像UUID。你可以试试


您的方法会起作用,但对于您瞄准的100万亿用户来说效率低下:-)

您是否已经为
authentication\u token
列建立了数据库索引?是的,对authentication\u token字段应用了索引。您是否已经为
authentication\u token
列建立了数据库索引?是的,索引应用于身份验证令牌字段。这不能保证是唯一的。不同的输入字符串可以分解为相同的输出。这不能保证是唯一的。不同的输入字符串可以分解为相同的输出。