SELECT TOP 10 * FROM T_USER ORDER BY NEWID();
Oracle:
SELECT * FROM (SELECT * FROM T_USER ORDER BY DBMS_RANDOM.RANDOM()) WHERE RONUM <= 10;
MySQL:
从 MySQL 随机选取数据最简单的办法就是使用 ”ORDER BY RAND() ”;
SELECT * FROM table ORDER BY RAND() LIMIT 10;
这种方法的问题就是非常慢。原因是因为 MySQL 会创建一张零时表来保存所有的结果集,然后给每个结果一个随机索引,然后再排序并返回。
有几个方法可以让它快起来。
基本思想就是先获取一个随机数,然后使用这个随机数来获取指定的行。
由于所有的行都有一个唯一的 id,我们将只取最小和最大 id 之间的随机数,然后获取 id 为这个数行。为了让这个方法当 id 不连续时也能有效,我们在最终的查询里使用 ”>=”代替”=”。
为了获取整张表的最小和最大 id,我们使用 MAX() 和 MIN() 两个聚合函数。这两个方法会返回指定组里的最大和最小值。在这里这个组就是我们表里的所有 id 字段值。
$range_result = mysql_query( " SELECT MAX(id) AS max_id , MIN(id) AS min_id FROM table ");
$range_row = mysql_fetch_object( range_result );
$random = mt_rand( range_row->min_id , $range_row->max_id );
$result = mysql_query( " SELECT * FROM `table` WHERE `id` >= random LIMIT 0,1 ");
就像我们刚才提到的,这个方法会用唯一的id值限制表的每一行。那么,如果不是这样情况怎么办?
下面这个方案是使用了 MySQL 的 LIMIT 子句。LIMIT 接收两个参数值。第一个参数指定了返回结果第一行的偏移量,第二个参数指定了返回结果的最大行数。偏移量指定第一行是0而不是1。
为了计算第一行的偏移量,我们使用 MySQL 的 RAND() 方法从 0 到 1 之间生成一个随机数。然后我们把这个数字跟我们用 COUNT() 方法获取倒的表记录数相乘。由于LIMIT的参数必须是int型而不能是 float,我们使用 FLOOR() 来处理结果。FLOOR() 会计算小于表达式的最大值。最终的代码就是这样:
$offset_result = mysql_query( " SELECT FLOOR(RAND() * COUNT(*)) AS offset FROM table ");
$offset_row = mysql_fetch_object( offset_result );
$offset = offset_row->offset;
$result = mysql_query( " SELECT * FROM `table` LIMIT offset, 1 " );
在 MySQL 4.1 以后我们可以使用子子查询合并上面两个方法
SELECT * FROM table WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM table ) ORDER BY id LIMIT 1;
这个方案跟方案二有同样的弱点,只对有唯一 id 值的表有效。
记住我们最初寻找选择随机行的替代方法的原因,速度!所以,这些方案的在执行时间上的比较会怎么样?我不会指出硬件和软件配置或者给出具体的数字。大概的结果是这样的:
-
最慢的是解决方案一(我们假定它用了 100% 的时间)。
-
方案二 - 79%
-
方案三 - 13%
-
方案四 - 16%
随机
提取
10
条
记录的例子: SQLServer:
Select
Top
10
*From表OrderByNewID() Access:
Select
Top
10
*From表OrderByRnd(ID) Rnd(ID)其中的ID是自动编号字段,可以利用其他任何数值来完成,比如用姓名字段(UserName)
Select
Top
10
*From表OrderBYRnd(Len(UserName))
MySql
:Sel...
select
count(device_id) from xp_device;
-- 适应有自增主键的表:利用自增主键
随机
查询
10
条
数据
(查到的
数据
主键ID是连续的) 300w
条
数据
,平均耗时0.013秒
SELECT
FROM xp_devi.
mysql
手册中存在rand()命令,能
获取
到
随机
行, 并使用limit
10
只采取其中几行。
SELECT
id FROM user ORDER BY RAND() LIMIT
10
;
数据
量小于
10
00行的时候,上面的 sql 执行的快。但是当
数据
大于
10
000行, 排序的开销就变得很重。上面的操作中,我们在排序完就把几乎所有的行都丢掉了。
只要我们有一个数字主键,我们可以有更好的方式去实...
SELECT
TOP
10
* FROM T_USER ORDER BY NEWID()
ORACLE:
SELECT
* FROM (
SELECT
* FROM T_USER ORDER BY DBMS_RANDOM.RANDOM()) WHERE RONUM
MySQL
:
SELECT
* FROM T_USER ORDER
网站开发中我们常遇到这么一个效果,
随机
展示
数据库
的几
条
数据
。那么在thinkphp中我们是如何
获取数据
库的
随机
几
条
数据
呢?先上代码:$article = new ArticleModel();$countcus = $article->count();$min = $article->min('id');$max = $min+$countcus;if($countcus < 4...
从SQLite
数据库
中
获取
10
个
随机
记录(Get
10
Random Records From SQLite Database)我无法找到一个从sqlite
数据库
中
获取
10
个
随机
记录的好方法。 看到一些与
mysql
一起使用的例子,但是即使我尝试使用Random()而不是rand(),它们似乎也不适用于sqlite。我试图
获取
随机数
,然后通过id
获取
记录,但由于某种原因,我得到的结果是其中几个。 如...
php中文网最新课程每日17点准时技术干货分享laravel如何高性能地从
mysql
数据库
中
随机
获取
n
条
数据
,有时候我们常常会需要从
数据库
随机
获取数据
,比如:给工作人员
随机
分配
10
个订单,
随机
从
数据库
中
随机
抽查
10
0个用户;这样我们就需要
随机
从
数据库
获取数据
。一、使用原生SQL从
数据库
获取
10
0
条
数据
从
Mysql
官网可以看到,可以让ORDER BY RAND()和LIMIT一起使用,可以...
网上找了好多看了还不是很明白,为了项目进度拿过来直接用。害怕以后还需要。好找一些,放在这里。若要在i ≤ R ≤ j 这个范围得到一个
随机
整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1))。例如, 若要在7 到 12 的范围(包括7和12)内得到一个
随机
整数, 可使用以下语句:
SELECT
FLOOR(7 + (RAND() * 6));以上摘抄自
MySQL
手...
1 System.nanoTime测试性能时,System.nanoTime比System.currentTimeMills更精确,前者使用纳秒计时,且对系统影响更小。具体来说:System.currentTimeMills返回自1970年1月1日以来经过的毫秒数,返回的精度与操作系统有关System.nanoTime:不是现实时间,是虚拟机提供的计时时间,精确到纳秒2 ThreadLocalRa...