mysql())随意查询记录效率问题和解决方案共享
实现上述结果有两种方法。
1。创建一个新的表,其中有5到5个表。然后使用伦德()命令获取一个随机数。
#指定范围的数据表
复制代码代码如下所示:
作者:萧强#(占卜)
#日期:2008-03-31
创建表randnumber
选择- 1作为数字
联盟
选择2
联盟
选择3
联盟
选择4
联盟
选择5
联盟
选择0
联盟
选择1
联盟
选择2
联盟
选择3
联盟
选择4
联盟
选择5
#得到随机数
作者:萧强#(占卜)
#日期:2008-03-31
选择号码
从randnumber顺序由伦德(1)限制
优点:随机数可以指定数据的一部分,不需要连续。
缺点:当随机数的范围非常宽时,很难建立一个表。
2。使用mysql()和()函数的圆()
一个SQL语句#修复
作者:萧强#(占卜)
#日期:2008-03-31
复制代码代码如下所示:
选择圆(((0.5-rand())* 2 * 5)
#笔记
# 0.5-rand()可以得到一个随机数0.5 + 0.5
#(0.5-rand)(* 2)可由随机数-获得1 + 1
#(0.5-rand)(* 2 * 5)可由随机数-获得5 + 5
#轮((((0.5-rand())* 2 * 5)可以得到随机整数从5到5
但后来我查看了MySQL的官方手册,而对于兰德(),它可能意味着不能在逐子句中使用兰德()函数,因为它会导致数据列多次扫描。然而,在MySQL 3.23版本中,仍然可以用兰德()实现随机顺序。
但这是一个真正的测试,发现效率很低,超过1500万的图书馆,查询5条数据,实际上超过8秒。
搜索谷歌,互联网基本上是查询MAX(ID)* *(),以便随机访问数据。
复制代码代码如下所示:
SELECT * FROM `表` T1连接(选择圆(RAND)*(选择(max(ID)从`表`)作为ID)为T2),t1.id t2.id顺序t1.id ASC限制> = 5;
但是这将产生5个连续的记录。这个解决方案每次只有一个查询和5个查询。即使如此,它也是值得的,因为15万个表,查询只需要不到0.01秒。
以下语句用于联接,MySQL的论坛
复制代码代码如下所示:
从表中选择*(从id到表(max)(ID)*伦德(从))表按ID限制为1的顺序;
我测试了它,它花了0.5秒,速度很好,但是与上面的语句有很大的差距。
所以我重写了语句。
复制代码代码如下所示:
从表中选择*
其中id(选择楼层=(兰德)* *(从表中选择(max(id))))
按ID限制订单1;
在这种情况下,效率提高了,查询时间仅为0.01秒。
最后,对句子进行了完善,并将min(id)添加到判断中,在测试开始时,我没有添加一个min(id)判断,结果是查询表中前几行的一半时间。
完整的查询语句是:
复制代码代码如下所示:
从表中选择*
其中ID(从(表)表(选择)- min(id)(选择)+表(+))中选择(=(*)(选择max(id)))
按ID限制订单1;
*选择
从'表'作为T1连接(选择圆(兰德())*((选择max(ID)选择))(+(max)(选择))+((x)))
在t1.id = t2.id
通过t1.id限1阶;
最后,这两个语句分别在PHP中进行了10次查询。
前者需要0.147433秒。
后者需要0.015130秒。
似乎使用连接的语法比直接使用函数效率更有效。
经过多次测试,我们得到的结果是使用连接的语法比直接使用的更快。有好朋友的朋友可以出来和别人聊天。