mysql优化--rand()优化
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
mysql优化--rand()优化
众所周知,在mysql中,随机的取10条数据,如:select * from users order by rand() limit 10,效果⾮常差,因为会多次的执⾏,如果等值查询⽤rand()也是效很差,
1.select id from users where id =111;
看查询计划可以得到,是是常量查询,⽽且是索引覆盖,速度⾮常快!
2.使⽤rand(),求随机数后检索
select id from users where id=round(rand()*1000);
执⾏计划很糟糕,虽然是扫描了索引,但是是全索引的扫描,很差,因为where条件中包含了rand(),使得mysql把它当做变量来处理。
⽆法⽤常量的等值查询。
3.改造成普通的⼦查询
select id from users where id =(select round(rand()*(select max(id) from users)) as nid)
查询计划也不好!(⼦查询会全表扫描)
4.改成join联表
select id from users as us inner join (select round(rand()*1000) as id2) as t2 on t2.id2=us.id
这样的执⾏计划就很好了,速度也很快
⼩结:从数据库随机的取⼀条数据时候,可以把rand()⽣成的随机数放到join中提⾼效率。
5.order by rand() limit n
随机取多条的时候
全索引扫描,⽣成排序临时表,⽂件排序,很慢!
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
全索引检索,发现符合记录的条件后,直接取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;。