稳定/可重复的随机排序(MySQL,Rails)

我想通过随机排序的ActiveRecord模型列表(来自MySQL数据库的行)进行分页。

但是,这种随机化需要在每个会话的基础上持续存在,以便访问该网站的其他人也可以获得随机的,可分页的记录列表。

假设有足够的实体(数万个)将随机排序的ID值存储在会话或cookie中太大,所以我必须暂时以其他方式(MySQL,文件等)保留它。

最初我以为我可以根据会话ID和页面ID创建一个函数(返回该页面的对象ID),但是由于MySQL中的对象ID值不是连续的(有间隙),因此我似乎崩溃了正在戳它。 好处是它不需要/最小存储,但缺点是它实现起来可能非常复杂并且可能是CPU密集型的。

我的感觉是我应该创建一个交集表,例如:

random_sorts( sort_id, created_at, user_id NULL if guest) random_sort_items( sort_id, item_id, position ) 

然后只需将’sort_id’存储在会话中。 然后,我可以像往常一样对random_sorts WHERE sort_id = n ORDER BY position LIMIT …进行分页。

当然,我必须在那里放一些收割机,以便在一段时间不活动后将它们移除(基于random_sorts.created_at)。

不幸的是,我必须在创建新对象时(和/或删除旧对象,尽管删除非常罕见)使排序无效。 并且,随着负载的增加,该表的大小/性能(甚至正确索引)下降。

看起来这应该是一个解决的问题,但我找不到任何这样做的轨道插件…任何想法? 谢谢!!

MySQL有一个RAND函数,你可以在你的ORDER子句中使用,传递一个绑定到用户会话的种子。

兰德令(?)

哪里? 是会话的种子值。 这将为您提供跨请求的可重复排序。

我可能错过了一些东西,但不会有这样的东西

select ... order by sha1(concat($session_id,item_id)) limit m,n;

工作给你一个随机排序,可重复的每会话分页列表? 索引使用不是很好,但你避免任何预填充/ tmp表/失效。

就个人而言,为了节省存储空间和理智,我只使用你的user_id使用随机种子。

 srand user_id items.sort_by{ rand }