您好,欢迎访问一九零五行业门户网

MySQL中从表中取出随机数据性能优化

在mysql中随机读取数据的方法可能大家最简单且常用的做是rand() 这个函数,但是如果上千万数据就有问题了,下面我来介绍。
最简的办法
rand() 函数实例
 代码如下 复制代码
select * from table_name order by rand() limit 5;
花时间为 0.7888
如果这样在数据量大时就挂了 后来找到一个办法
 代码如下 复制代码
select * from table_name as r1 join (select round(rand() * (select max(id) from table_name)) as id) as
r2 where r1.id >= r2.id order by r1.id asc limit 5;
花时间0.02 sec
上面的语句采用的是join,mysql的论坛上有人使用
 代码如下 复制代码
select *
from `table`
where id >= (select floor( max(id) * rand()) from `table` )
order by id limit 1;
我测试了一下,需要0.5秒,速度也不错,但是跟上面的语句还是有很大差距。总觉有什么地方不正常。
于是我把语句改写了一下。
 代码如下 复制代码
select * from `table`
where id >= (select floor(rand() * (select max(id) from `table`))) 
order by id limit 1;
这下,效率又提高了,查询时间只有0.01秒
最后,再把语句完善一下,加上min(id)的判断。我在最开始测试的时候,就是因为没有加上min(id)的判断,结果有
一半的时间总是查询到表中的前面几行。
完整查询语句是:
 代码如下 复制代码
select * from `table`
where id >= (select floor( rand() * ((select max(id) from `table`)-(select min(id) from `table`)) +
(select min(id) from `table`)))  order by id limit 1;
select *
from `table` as t1 join (select round(rand() * ((select max(id) from `table`)-(select min(id) from
`table`))+(select min(id) from `table`)) as id) as t2
where t1.id >= t2.id
order by t1.id limit 1;
最后在php中对这两个语句进行分别查询10次,
前者花费时间 0.147433 秒
后者花费时间 0.015130 秒
其它类似信息

推荐信息