使用sql语句在mysql的表中随机获取数据

Posted 好大的月亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用sql语句在mysql的表中随机获取数据相关的知识,希望对你有一定的参考价值。

rand()获取随机数据问题

有时候会有这样的业务场景,随机获取几条数据,网上一搜有好多使用

select * from xxx order by rand() limit x

在数据量比较小的时候这个是没问题的,但是一旦数据量上来就会非常的慢
,我自己本地搞了900w+的数据,随机取6条就需要大概20s+。

原因是扫描了全表,这还了得。。。

在这里插入图片描述

在这里插入图片描述

解决方案

方法1:
mysql里的id一般都是聚簇索引,这个时候我们可以利用上id来做操作

建议查询10次以下用这个语句多次查询比一次rand()效率高的多,每次都是获取的不同的数据。
不直接limit 10的原因是这样获取的数据都是连续的id了。

select u.* from 
user u join (
	select ROUND(
		(rand() * (select max(id) from user) - (select min(id) from user)) + (select min(id) from user)
	) as id
) u2
where u.id >= u2.id
limit 1

在这里插入图片描述

方法2:
也可以这样操作,如果只需要获取100条,那么我们可以在方法1的基础上获取200条然后在内存中再随机取100条,这样也可以。

比如java可以直接利用

//洗牌
Collections.shuffle();

打乱List的顺序,然后捞指定数量的数据

以上是关于使用sql语句在mysql的表中随机获取数据的主要内容,如果未能解决你的问题,请参考以下文章

如何从mysql数据库中获取一个表的表结构

如何在for循环中执行准备好的语句以从jsp中的表中获取数据?

SQL语句如何实现从数据库表中查询随机数据的记录

从使用 MySql 创建的表中获取 ROW ID 以与 OnClick 函数一起使用

MySQL高级

怎么往mysql数据库的表中批量导入数据