我有一个模型,我存储了大约250k个实例。如果我想获得一个随机实例,那么执行以下操作非常简单:
rand_offset = Random.new.rand(Model.count)
model = Model.limit(1).offset(rand_offset)
这很好用,随机偏移解析为快速COUNT(*)SQL查询。
但是,我还想获取一个涉及组子句的随机记录,例如:
rand_offset = Random.new.rand(Model.group(:field).having("COUNT(*)>?", minimum).count.count)
model = Model.group(:field).having("COUNT(*)>?", minimum).limit(1).offset(rand_offset)
这明显变慢,因为它不是在分组子查询上执行SELECT COUNT(*)来查找随机偏移量,而是返回与该查询匹配的每个记录,然后在随机化之前返回该数组的计数。当它返回数十万个结果时,这给了我一些明显的缓慢。有没有办法加速这个,而不是直接编写SQL?