mysql随机化结果和优化

时间:2013-07-16 15:59:49

标签: mysql select optimization random

我希望在查询后有随机化的行,但是使用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/

有什么东西可以帮助我吗?

我试图将随机数据分成分页,因此当用户查询数据库时,他将始终以随机顺序获取行。 谢谢你的帮助。

1 个答案:

答案 0 :(得分: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,seed)
  • 每隔x秒(可能每小时,每天,......)运行脚本,重新记录这些列(见下文)
  • 当用户第一次打开行列表时(或者当您想要重新发送项目时),将任何随机groupId保存到用户的会话中; groupId可以是0到(从lieky中选择max(groupId))
  • 显示您使用查询的行:(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)