MySQL优化慢取随机数据的方法

前天因为我要从一个数记录5w记录数据库中随机抽取,我是直接使用MySQL兰德的函数直接成千上万的记录在这里,没关系,但如果几万到几秒的感觉,这是非常缓慢的,下面的小家。看看mysql的随机数据慢速优化过程。
MySQL经常需要得到随机数据,例如,随机从tablename表中提取一个记录。
复制代码代码如下所示:
选择字段的顺序由兰德(1)限制

但后来我查看了MySQL的官方手册,而对于兰德(),它可能意味着不能在逐子句中使用兰德()函数,因为它会导致数据列多次扫描。然而,在MySQL 3.23版本中,仍然可以用兰德()实现随机顺序。
经过测试发现效率很低,超过1500万的图书馆,查询了5条数据,实际超过8秒。看看官方手册,并说,兰德()是多次执行的顺序条款,自然效率和低。
不能以顺序的方式使用带有兰德()值的列。
搜索谷歌,互联网基本上是查询MAX(ID)* *(),以便随机访问数据。
复制代码代码如下所示:
*选择
from'table'as T1连接(选择圆(rand()*(选择最大值(ID)从))
在t1.id = t2.id
通过t1.id ASC限制5阶;

但是这将产生5个连续的记录。这个解决方案每次只有一个查询和5个查询。即使如此,它也是值得的,因为15万个表,查询只需要不到0.01秒。
下面的语句用于连接,MySQL的论坛:
复制代码代码如下所示:
*选择
from'table
其中ID(选择地板> =(最大*兰德)(ID)(从)}})
按ID限制订单1;

我测试了它,它花了0.5秒,速度很好,但是与上面的语句有很大的差距。
所以这个句子被改写了。
复制代码代码如下所示:
SELECT * from'table
其中ID(选择地板=(RAND)*(选择(max(ID)from'table ')))
按ID限制订单1;

在这种情况下,效率提高了,查询时间仅为0.01秒。
最后,对句子进行了完善,并将min(id)添加到判断中,在测试开始时,我没有添加一个min(id)判断,结果是查询表中前几行的一半时间。
完整的查询语句是:
复制代码代码如下所示:
SELECT * from'table'where ID(> =
选择地板(
RAND()*((选择最大值(ID)from'table ')-(选择min(ID)from'table ')))
+(选择min(ID)from'table)


按ID限制订单1;

选择加入(from'table'as T1
选择圆(
#最小(1 +最小值和最大值的差)
兰德()*
(选择最大值(ID)from'table ')-(选择min(ID)from'table)

+(选择min(ID)from'table)
为ID
T2
在t1.id = t2.id
通过t1.id限1阶;

最后,这两个语句在PHP中查询10次,前者需要0.147433秒,后者需要0.015130秒。
复制代码代码如下所示:
* SELECT
从表作为t1连接(选择圆(兰德())*((选择max(ID)选择)))-(*())(+)。
在t1.id = t2.id
通过t1.id限10阶;

这是我自己的选择,从以前的5秒到现在的0.0003秒的时间,不必找出10条记录。