gpt4 book ai didi

sql - 优化查询,使 Order by random 运行得更快

转载 作者:数据小太阳 更新时间:2023-10-29 08:08:00 25 4
gpt4 key购买 nike

在我的 Rails 应用程序中,我有一个如下所示的方法:

def find_person(field, attribute)
Person.where.not(Hash[field, nil])
.where.not("lower(#{field}) = ?", attribute.downcase)
.where("difference(#{field}, ?) < 2", attribute)
.order('RANDOM()')
.limit(3)
.pluck("lower(#{field})")
.uniq
end

由于 .order('RANDOM()'),此查询非常慢。我怎样才能使这个查询更快?

最佳答案

另一种方法,使用 Ruby 获取 3 个随机记录。

def find_person(field, attribute)
ids = Person.where.not(Hash[field, nil])
.where.not("lower(#{field}) = ?", attribute.downcase)
.where("difference(#{field}, ?) < 2", attribute)
.pluck("id")

Person.where(:id => ids.sample(3))
end

如果 pluck 太慢,另一种方法。

def find_person(field, attribute)
q = Person.where.not(Hash[field, nil])
.where.not("lower(#{field}) = ?", attribute.downcase)
.where("difference(#{field}, ?) < 2", attribute)

max = q.count
offsets = [rand(max), rand(max), rand(max)]
offsets.map { |o| q.offset(o).limit(1).pluck("lower(#{field})").first }

end

关于sql - 优化查询,使 Order by random 运行得更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32586823/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com