mysql 随机返回多条记录的问题

2021-07-12 11:09:05 +08:00
 wbd31

我看到的解决方案有两种

一种 order by rand() 可能存在性能问题

一种 SELECT id FROM table WHERE id >= FLOOR(RAND() * 1000) LIMIT 10;

第二种方式有点迷惑,为什么返回的不是 10 条连续的记录,而是 10 条随机记录?而且返回的结果不是那么随机的

1983 次点击
所在节点    MySQL
8 条回复
ch2
2021-07-12 11:14:57 +08:00
没有排序就这样
eric96
2021-07-12 11:37:24 +08:00
第二种方式返回的数据是连续的,除非你表里的 id 本身不连续。
可以看下 mysql45 讲的 17 章,如何返回随机的数据
myd
2021-07-12 12:11:28 +08:00
第二种方式返回的数据是不连续的,因为每扫描一行数据都会执行一次 FLOOR()和 RAND(),你可以把函数改成 sleep 验证一下。
codingadog
2021-07-12 12:28:00 +08:00
所以第二种到底是不是连续的。。。
myd
2021-07-12 12:29:24 +08:00
试了一下,返回的结果确实不是很随机。
1. 结果中 id 是递增的,因为扫描顺序也是根据 id 的顺序。
2. 其次,前面的记录被返回的几率更大,有 limit 的存在,id 小的记录满足 where 条件了就不会继续往后扫描了。
alvin2ye
2021-07-12 12:56:30 +08:00
用 id > rand limit 1, union 4 条
xuanbg
2021-07-12 13:05:13 +08:00
连续不连续其实无所谓,换个角度,n 条记录你可以把它当做一个集合。关键是这个集合要随机。
我的做法是总条数-n 取一个随机数,然后获取连续的 n 条记录。最简单,也最高效。
xiang0818
2021-07-13 10:15:50 +08:00
SELECT id FROM mbo_user WHERE id >= FLOOR(RAND() * 1000) LIMIT 10;
每次执行结果一样,这个查询是幂等的?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/788960

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX