MySQL中rand函数随机取数据介绍

 代码如下 复制代码

SELECT * FROM table_name ORDER BY rand() LIMIT 5;

rand在手册里是这么说的:
RAND()
RAND(N)
返回在范围0到1.0内的随机浮点值。如果一个整数参数N被指定,它被用作种子值。

 代码如下 复制代码
mysql> select RAND();
        -> 0.5925
mysql> select RAND(20);
        -> 0.1811
mysql> select RAND(20);
        -> 0.1811
mysql> select RAND();
        -> 0.2079
mysql> select RAND();
        -> 0.7888

你不能在一个ORDER BY子句用RAND()值使用列,因为ORDER BY将重复计算列多次。然而在MySQL3.23中,你可以做: SELECT * FROM table_name ORDER BY RAND(),这是有利于得到一个来自SELECT * FROM table1,table2 WHERE a=b AND c<d ORDER BY RAND() LIMIT 1000的集合的随机样本。注意在一个WHERE子句里的一个RAND()将在每次WHERE被执行时重新评估。

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

 代码如下 复制代码
SELECT *
FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `table`)) AS id) AS t2
WHERE t1.id >= t2.id
ORDER BY t1.id ASC LIMIT 5;

但是这样会产生连续的5条记录。解决办法只能是每次查询一条,查询5次。即便如此也值得,因为15万条的表,查询只需要0.01秒不到。
 
上面的语句采用的是JOIN,mysql的论坛上有人使用
 
 

 代码如下 复制代码
SELECT *
FROM `table`
WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` )
ORDER BY id LIMIT 1;

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

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

完整查询语句是:
 

 代码如下 复制代码
 
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 秒

执行效率需要0.02 sec.可惜的是,只有mysql 4.1.*以上才支持这样的子查询.

注意事项 查看官方手册,也说rand()放在ORDER BY 子句中会被执行多次,自然效率及很低。

时间: 2024-10-26 05:14:54

MySQL中rand函数随机取数据介绍的相关文章

ado-从mysql中以字符串形式取数据

问题描述 从mysql中以字符串形式取数据 ado 连接取数据库里面数据时,以字符串形式取出数据,所有数据都按字符串形式取.有没有这类函数 解决方案 你讲数据取出来然后转换成字符串类型不就可以了. 解决方案二: 你可以判断类型呀.从数据库中拿到数据,判断一下它的类型,然后全部转换成字符串类型. 解决方案三: JAVA中有一个,查询到的ResultSet取数据的时候可以使用getString(int columnIndex)方法来将对应的列数据转换成字符串. 解决方案四: MySqlDataRea

Matlab中Rand()函数用法

一.理论准备        matlab函数randn:产生均值为0,方差 σ^2 = 1,标准差σ = 1的正态分布的随机数或矩阵的函数.       用法:Y = randn(n),返回一个n*n的随机项的矩阵.如果n不是个数量,将返回错误信息.       Y = randn(m,n) 或 Y = randn([m n]),返回一个m*n的随机项矩阵.       Y = randn(m,n,p,...) 或 Y = randn([m n p...]),产生随机数组(感觉就是三维数组,请看

mySQL随机取数据的执行效率

昨晚我在编写"路过的"的应用随机取笑话的时候发现一个问题,我的目标是从笑话表(大约几万条数据量)中随机抽取一条笑话并显示,起初我的SQL如下: Sql代码 select * from xiaohua limit 随机数,1 其中随机数是由java程序产生,当随机数比较小时,发现执行速度非常快,但当随机数如超过1w时,执行速度超慢,看来这条路是行不通了,于是我又利用mysql的rand()函数,看看执行效率,发现效率也不好,最后我通过google了一下,发现碰到这个问题的人还是很多的,最

MySQL中group_concat函数使用例子

本文通过实例介绍了MySQL中的group_concat函数的使用方法,比如select group_concat(name) . MySQL中group_concat函数 完整的语法如下: group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符']) 基本查询 mysql> select * from aa; +--+--+ | id| name | +--+--+ |1 | 10| |1 | 20| |1

mysql中RAND()随便查询记录效率问题和解决办法分享_Mysql

最近由于需要大概研究了一下MYSQL的随机抽取实现方法.举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1. 有两个方法可以达成以上效果. 1.新建一个表,里面存着 -5 至 5 之间的数.再利用order by rand()得到随机数. #建立指定范围数据表 复制代码 代码如下: #auther: 小强(占卜师) #date: 2008-03-31 create table r

mysql中RAND()随便查询记录效率问题和解决办法

最近由于需要大概研究了一下MYSQL的随机抽取实现方法.举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1. 有两个方法可以达成以上效果. 1.新建一个表,里面存着 -5 至 5 之间的数.再利用order by rand()得到随机数. #建立指定范围数据表  代码如下 复制代码 #auther: 小强(占卜师) #date: 2008-03-31 create table r

mysql中group_concat函数用法

一.语法   GROUP_CONCAT([DISTINCT] expr [,expr ...] [ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC] [,col_name ...]] [SEPARATOR str_val])   也可以简单的理解   group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'])   二.group_concat

PHP中file_get_contents函数抓取https地址出错的解决方法(两种方法)_php实例

方法一: 在php中,抓取https的网站,提示如下的错误内容: Warning: file_get_contents() [function.file-get-contents]: failed to open stream: Invalid argument in I:Webmyphpa.php on line 16 打开php.ini文件找到 ;extension=php_openssl.dll ,去掉双引号";" ,重启web服务器即可. apache服务器的话,可以同时启用m

mysql中concat函数实现数据库字段合并查询

mysql中怎么合并两个字段为一个字段呢?试了好多方法,结果还是不是我想要的 例如:select (a+b) as c from 表 类型也一致都是varchar型的,可就是显示不正确. 直到concat() MySQL中concat函数 下面通过一个例子介绍MySQL中的concat函数的使用方法,比如select concat('11','22','33'). MySQL中concat函数 使用方法: CONCAT(str1,str2,-)  返回结果为连接参数产生的字符串.如有任何一个参数