添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
爱看球的海龟  ·  凸体Legendre 椭球的体积·  11 月前    · 
暴走的伤疤  ·  jarsigner' ...·  2 年前    · 
打酱油的椰子  ·  校友风采 | ...·  2 年前    · 
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...