MYSQL中RAND子句的使用_mysql优化--rand()优化

众所周知,在mysql中,随机的取10条数据,如:select * from users order by rand() limit 10,效果非常差,因为会多次的执行,如果等值查询用rand()也是效很差,

1.select id from users where id =111;

cb12f7e284d089f677cbbeda17300aa4.png

看查询计划可以得到,是是常量查询,而且是索引覆盖,速度非常快!

2.使用rand(),求随机数后检索

select id from users where id=round(rand()*1000);

114c82f7945d43e1f65de2d38511273f.png

执行计划很糟糕,虽然是扫描了索引,但是是全索引的扫描,很差,因为where条件中包含了rand(),使得mysql把它当做变量来处理。无法用常量的等值查询。

3.改造成普通的子查询

select id from users where id =(select round(rand()*(select max(id) from users)) as nid)

f0138bc1ab08476e37ce65db20a7379e.png

查询计划也不好!(子查询会全表扫描)

4.改成join联表

select id from users as us inner join (select round(rand()*1000) as id2) as t2 on t2.id2=us.id

b3953d7e0dda3730f9075f02c55b8a8a.png

这样的执行计划就很好了,速度也很快

小结:从数据库随机的取一条数据时候,可以把rand()生成的随机数放到join中提高效率。

5.order by rand() limit n

随机取多条的时候

2c02fdbefb3a358ee5d0a3f5577a31a1.png

全索引扫描,生成排序临时表,文件排序,很慢!

6.仿照join方式

select id from users as us inner join (select round(rand()*(select max(id) from users)) as ids) as t1 on us.id>t1.ids limit n

2fcfe12ae969cf1c3e88cfd17f13bda2.png

全索引检索,发现符合记录的条件后,直接取10行,这个方法是最快的。

PS:综上:

想从mysql数据库里随机的取一条或者多条时,最好把rand生成的随机数放到join子句中,提高查询效率。

就是把这个sql:

select id from table order by rand() limit n;

变成这个sql:

select id from table t1 join (select round(rand()*(select max(id ) from table)) as idd) as t2 on t1.id>t2.idd limit n;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值