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