数据库教程:MySQL 随机函数获取数据速度和效率分析分享

在mysql中带了随机取数据的函数,在mysql中我们会有rand()函数,很多朋友都会直接使用,如果几百条数据肯定没事,如果几万或百万时你会发现,直接使用是错误的。下面我来介绍随机取数据一些优化方法。

SELECT*FROMtable_nameORDERBYrand()LIMIT5;

rand在手册里是这么说的:

RAND()
RAND(N)

返回在范围0到1.0内的随机浮点值。如果一个整数参数N被指定,它被用作种子值。

mysql>selectRAND(); ->0.5925 mysql>selectRAND(20); ->0.1811 mysql>selectRAND(20); ->0.1811 mysql>selectRAND(); ->0.2079 mysql>selectRAND(); ->0.7888

你不能在一个ORDERBY子句用RAND()值使用列,因为ORDERBY将重复计算列多次。然而在MySQL3.23中,你可以做:SELECT*FROMtable_nameORDERBYRAND(),这是有利于得到一个来自SELECT*FROMtable1,table2WHEREa=bANDc<dORDERBYRAND()LIMIT1000的集合的随机样本。注意在一个WHERE子句里的一个RAND()将在每次WHERE被执行时重新评估。

网上基本上都是查询max(id)*rand()来随机获取数据。

SELECT* FROM`table`ASt1JOIN(SELECTROUND(RAND()*(SELECTMAX(id)FROM`table`))ASid)ASt2 WHEREt1.id>=t2.id ORDERBYt1.idASCLIMIT5;

但是这样会产生连续的5条记录。解决办法只能是每次查询一条,查询5次。即便如此也值得,因为15万条的表,查询只需要0.01秒不到。

上面的语句采用的是JOIN,mysql的论坛上有人使用

SELECT* FROM`table` WHEREid>=(SELECTFLOOR(MAX(id)*RAND())FROM`table`) ORDERBYidLIMIT1;

我测试了一下,需要0.5秒,速度也不错,但是跟上面的语句还是有很大差距

后来请教了baidu,得到如下代码

完整查询语句是:

SELECT*FROM`table` WHEREid>=(SELECTfloor(RAND()*((SELECTMAX(id)FROM`table`)-(SELECTMIN(id)FROM`table`))+(SELECTMIN(id)FROM`table`))) ORDERBYidLIMIT1; SELECT* FROM`table`ASt1JOIN(SELECTROUND(RAND()*((SELECTMAX(id)FROM`table`)-(SELECTMIN(id)FROM`table`))+(SELECTMIN(id)FROM`table`))ASid)ASt2 WHEREt1.id>=t2.id ORDERBYt1.idLIMIT1;

最后在php中对这两个语句进行分别查询10次,

前者花费时间0.147433秒

后者花费时间0.015130秒

执行效率需要0.02sec.可惜的是,只有mysql4.1.*上述就是数据库技术:MySQL 随机函数获取数据速度和效率分析分享的全部内容,如果对大家有所用处且需要了解更多关于mysql数据库学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/dtteaching/912436.html

(0)
上一篇 2021年10月26日
下一篇 2021年10月26日

精彩推荐