通过减少迭代和db命中重构代码

时间:2016-06-03 09:06:31

标签: 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万亿。如果我发出上述脚本并且每次迭代生成的令牌与记录匹配,则循环将迭代100万亿次,DBMS也会发生同样的搜索记录。有没有任何解决方案可以通过减少迭代和减少db-hits来快速解决这个问题(假设每次迭代都会给出匹配记录)。说真的,对不起!如果问题没有意义并让我知道,我会尽快删除。谢谢。快乐的编码。

3 个答案:

答案 0 :(得分:1)

代码看起来很好。通常首选find_by(authentication_token: token)来检索单个记录。

确保为authentication_token列添加索引。如果你有很多记录,这将大大加快查询速度。如果您不了解数据库索引,请参阅this answer。

我不担心优化迭代次数或数据库命中率,因为即使在第一次尝试时你也会找到匹配令牌的机会很小。

答案 1 :(得分:1)

为什么你要使用这样的东西?

token = Digest::MD5.hexdigest (rand.to_s << Time.now.to_i.to_s)

这里我创建一个随机数,并附加当前时间戳,并为该字符串值获取MD5哈希值。这将是非常好的秘密令牌,它将是独一无二的。

如果您仍然对唯一性标准不满意,那么只需在开始时附加用户的ID即可。

没有涉及查询

答案 2 :(得分:1)

您正在寻找创建随机但唯一的令牌。对我来说听起来像UUID。您可以尝试https://github.com/assaf/uuid

您的方法可行,但对于您所针对的100万亿用户来说效率低下: - )