什么是"改组"数据库记录表的最佳方法?

Jak*_*old 6 mysql database random ruby-on-rails

假设我有一堆包含大量记录的表,我想随机向用户呈现这些记录.我还希望用户能够来回分页,所以我必须坚持某种顺序,至少在一段时间内.

该应用程序基本上只是AJAX,它使用缓存已经访问过的页面,所以即使我总是提供随机结果,当用户试图返回时,他将获得上一页,因为它将从本地缓存加载.

问题是,如果我只返回随机结果,可能会有一些重复.每个页面包含6个结果,所以为了防止这种情况,我必须做一些像WHERE id NOT IN (1,2,3,4 ...)我放置所有以前加载的ID的地方.

该解决方案的巨大缺点是无法在服务器端缓存任何内容,因为每个用户都会请求不同的数据.

替代解决方案可能是创建另一个列来排序记录,并在此处每次插入时间单位随机播放.这里的问题是,我需要将序列中的随机数设置为表中的每个记录,这将占用与记录一样多的查询.

如果有任何相关性,我正在使用Rails和MySQL.

noo*_*odl 7

试试这个:

mysql> create table t (i int);
mysql> insert into t values (1),(2),(3),(4),(5),(6);
mysql> select * from t order by rand(123) limit 2 offset 0;
+------+
| i    |
+------+
|    6 | 
|    4 | 
+------+
mysql> select * from t order by rand(123) limit 2 offset 2;
+------+
| i    |
+------+
|    2 | 
|    3 | 
+------+
mysql> select * from t order by rand(123) limit 2 offset 4;
+------+
| i    |
+------+
|    5 | 
|    1 | 
+------+
Run Code Online (Sandbox Code Playgroud)

请注意,rand()函数具有种子值(123).另请注意,如果重复最后三个查询,则每次都会得到相同的结果.