mysql 随机化结果和优化

标签 mysql select optimization random

我希望在查询后获得随机行,但在具有 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/

相关文章:

mysql - Docker搭建mysql数据库环境

sql - MySQL SELECT 与 join、count、order by

javascript - 如何在 javascript 中选择大整数中的第 n 个数字?

c# - 优化 LINQ Count() > X

Java可以识别CPU的SIMD优势;或者只是循环展开的优化效果

c# - 我在哪里可以找到 c# 的 mysql.data.dll

php - 如何使用数组插入多个数据

C# 与 MySQL 连接器 - 访问被拒绝

php - 代码点火器选择为

c - 关于 GCC 优化器的问题以及为什么这段代码总是返回 42?