【问题标题】:mysql randomizing result and optimizationmysql随机化结果和优化
【发布时间】:2013-07-14 22:11:14
【问题描述】:

我想在查询后随机化行,但是在有 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/

有什么可以帮助我的吗?

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

【问题讨论】:

    标签: mysql select optimization random


    【解决方案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) — 它应该非常快

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

    update lieky set Seed = rand()*1000000
    

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

    【讨论】:

    • 嗯,这也是一种可能性,但我宁愿在每次点击后都成功。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多