需求是:从数据库中随机取出符合条件的几条数据;
可使用下面来随机获取5条数据
select * from table order by rand() limit 5
需要注意: 这种方式只适合本身数据比较少或者通过where条件符约束后数据量很少的情况下使用,因为order by rand()
会整体排序,数据量比较大的时候速度很慢。
经测试在50W条数据中随机取需要十几秒的时间。
数据量比较大的优化方案
优化方案1
1. 取表id的最大值m、最小值n
2. 计算随机 r= (m-n)*rand + n
3. 取 id >= r 的第一个值
4. 重复2、3步,取需要的个数
缺点 id不保证是连续的,所以这个方案并不是严格的随机。
优化方案2
1. 取表的总行数 n
2. 1-n 之间取随机数多个..... ,进行排序得到从小到大 r1、r2、r3.....
3. `select * from table limit r1,1` 获取ID id1
`select * from table where id > id1 limit r2,1` 获取ID id2
`select * from table where id > id2 limit r3,1`
相比o`rder by rand()` 减少了扫描行数并且不用数据库做排序操作