0

我想在查询后有随机的行,但是order by rand()在一个有 120k+ 行的表上使用只是耗尽。我找到了一个小解决方案,它只输出行数,但它运行起来就像从随机索引开始,然后返回 #number of rows 之后。它非常快,但这只是在随机索引之后返回一些行。代码如下:

SELECT *
FROM lieky AS r1 JOIN 
   (SELECT (RAND() *
                 (SELECT MAX(col_0)
                    FROM lieky)) AS id)
    AS r2
WHERE r1.col_0 >= r2.id
ORDER BY r1.col_0 ASC
LIMIT 100

我在这里找到了它:http: //jan.kneschke.de/projects/mysql/order-by-rand/

有什么可以帮助我的吗?

我正在尝试将随机数据放入分页中,因此当用户查询数据库时,他将始终以随机顺序获取行。感谢帮助。

4

1 回答 1

1

应当指出的是

(SELECT (RAND() * (SELECT MAX(col_0) FROM lieky)) AS id)

可以返回 MAX(col_0),所以你只会得到 1 行(因为 WHERE r1.col_0 >= r2.id)

我认为好的解决方案应该是这样的:

  • 添加两列groupId int,seed int;添加索引indexName(groupId,种子)
  • 每 x 秒(可能是每小时、每天……)运行将重新计算这些列的脚本(见下文)
  • 当用户第一次打开您的行列表时(或者当您想要重新排序项目时)您将任何随机 groupId 保存到用户的会话中;groupId 可以从 0 到 (select max(groupId) from lieky)
  • 显示您使用查询的行,例如:(select * from lieky where groupId=%saved groupId% order by Seed limit x,100)——它应该非常快

关于 recalc 脚本,它会相当慢(所以最好在晚上运行它)。
您可以使用以下方法更新种子:

update lieky set Seed = rand()*1000000

然后为前 N 行设置 GroupId=0,为后续 N 行设置 GroupId=1,...
N 是您可以为用户显示的最大行数 (max_page)*(per_page_count)

于 2013-07-16T16:54:19.517 回答