最近在做一个场次池的功能,遇到需要在大量数据中随机取出来N条记录,搜集到3种方法,亲测如下
第一种:
select * from `table` order by rand() limit 80
这种在数据量小的时候还可以,在数据量大的时候就会感觉到很无力效率很低,故推荐下面两种
第二种:
SELECT * FROM `table`
WHERE id >=
((SELECT MAX(id) FROM `table`) - (SELECT MIN(id) FROM `table`)) * RAND() + (SELECT MIN(id) FROM `table`)
LIMIT 80
第二种在数据量大的时候效率立马就会感受到不一样
第三种:
SELECT *
FROM `table` AS t1 JOIN
(SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`))+(SELECT MIN(id) FROM `table`)) AS id) AS t2
WHERE t1.id >= t2.id
ORDER BY t1.id LIMIT 80;
后两种方式会出现随机结果但是顺序是连续,效率比第一种高.