一般来说从数据库中随机获取n条数据都会使用到RAND()函数。MySQL中的RAND()函数用于返回范围0 <= V <1.0的随机浮点值V。
以下通过一张主键id为自增的10w数据的数据表来测试。
最直接的使用就是一下这种方式:
SELECT * FROM `table_name` ORDER BY RAND() LIMIT 1;
在单表数据10w的情况下,随机获取1条需要耗时 0.037s:
而随机获取100条则同样需要耗时 0.037s:
查询出来的数据也确实是随机分布的,而且随机程度非常高:
但是如果通过主键是自增的这个特性,我们可以将上面的sql语句改写为:
SELECT * FROM `table_name` WHERE t1.id>=(RAND()*(SELECT MAX(id) FROM `table_name`))LIMIT 1;
在单表数据10w的情况下,随机获取1条仅需要耗时 0.001s:
而随机获取100条则只需要耗时 0.002s:
查询出来的数据也是随机分布的,但是随机的程度不高,10w条数据随机取100条数据经过多次执行,结果最大的id都不超过5000:
总结:
按照随机的效率来说,第二种远超过第一种,但是按照随机程度来说,第一种的随机程度会更高。