使用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的表中随机获取数据的主要内容,如果未能解决你的问题,请参考以下文章
如何在for循环中执行准备好的语句以从jsp中的表中获取数据?