我希望在查询后获得随机行,但在具有 120k+ 行的表上使用 order by rand()
实在是太累人了。我找到了一个小解决方案,它只输出行数,但它的运行方式就像从随机索引开始,然后返回#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/
有什么可以帮助我的吗?
我试图将随机数据放入分页中,因此当用户查询数据库时,他将始终以随机顺序获取行。 感谢您的帮助。
最佳答案
需要注意的是
(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 保存到用户的 session 中; groupId 可以从 0 到(从 lieky 中选择 max(groupId))
- 要显示您使用如下查询的行:(select * from lieky where groupId=%saved groupId% order by Seed limit x,100) - 它应该非常快
关于重新计算脚本,它会相当慢(所以最好在晚上运行它)。
您可以使用以下方式更新种子:
update lieky set Seed = rand()*1000000
然后为前 N 行设置 GroupId=0,为后 N 行设置 GroupId=1,...
N 是您可以为用户显示的最大行数 (max_page)*(per_page_count)
关于mysql 随机化结果和优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17681464/