MySQL数据库中随机获取一条或多条记录

工作中会遇到从数据库中随机获取一条或多条记录的场景,下面介绍几种随机获取的方法供参考。

首先创建个users表演示

1
2
3
4
5
6
7
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

表中存放30万记录。

1、使用order by rand()

1
SELECT * FROM users ORDER BY RAND() LIMIT 1;

LIMIT 1的执行时间:0.559s, LIMIT 100 耗时0.660s。

此种方法在数据量小的情况下可以使用,但在生产环境不建议使用。

MYSQL手册里面针对RAND()的提示大概意思就是,在 ORDER BY从句里面不能使用RAND()函数,因为这样会导致数据列被多次扫描,导致效率相当相当的低,效率不行,切忌使用。

2、使用join及rand()函数

1
2
SELECT * FROM users AS t1 JOIN (SELECT ROUND(RAND()*(SELECT MAX(id) 
FROM users)) AS id) AS t2 WHERE t1.id>=t2.id ORDER BY t1.id LIMIT 1;

此sql随机获取一条的时间是0.014s,LIMIT 100时耗时 0.020s,性能上没差多少。

获取多条的话有时会达不到要求(获取的记录数可能达不到多条)

3、子查询及rand()函数

1
SELECT * FROM users as t1 WHERE t1.id>=(RAND()*(SELECT MAX(id) FROM users)) LIMIT 1;

随机去一条的耗时:0.015,LIMIT 100时耗时 0.026s。

随机获取一条记录推荐使用 第2种方法,在30万条记录时也只需0.014s。


MySQL数据库中随机获取一条或多条记录
https://river106.cn/posts/d2fcd3c7.html
作者
river106
发布于
2020年1月5日
许可协议