
我看到的解决方案有两种
一种 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 第二种方式返回的数据是不连续的,因为每扫描一行数据都会执行一次 FLOOR()和 RAND(),你可以把函数改成 sleep 验证一下。 |
4 Duolingo 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; 每次执行结果一样,这个查询是幂等的? |