2013-07-16 126 views
0

我想在查询后有随机化的行,但使用order by rand()只是用尽了120k +行的表。我发现了一个小的解决方案,它只输出行数,但它像从随机索引开始一样运行,然后返回#行数。它非常快,但它只是在随机索引后返回一些行。该代码是这样:mysql随机化结果和优化

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/

有什么能帮助我吗?

我想获得随机数据分页,所以当用户查询数据库时,他将始终以随机顺序获取行。 感谢您的帮助。

回答

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到(从lieky中选择max(groupId))
  • 显示你使用查询的行如:(select * from lieky where groupId =%save groupId%order by Seed limit x,100) - 它应该是非常快

关于recalc脚本,它会比较慢(所以最好在晚上运行它)。
种子可以通过使用更新:

update lieky set Seed = rand()*1000000 

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

+0

嗯,这也是一种可能性,但我宁愿每次点击后都做出来。谢谢 – kalafun