从MySQL随机选取数据最简单的办法就是使用”ORDER BY RAND()”;

方案一:

SELECT * FROM `table` ORDER BY RAND() LIMIT 0,1;

这种方法的问题就是非常慢。原因是因为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%

方案三胜出!

mysql 随机选择数据_从MySQL随机选取数据相关推荐

  1. mysql嵌套选择代码_关于mysql:嵌套联合选择语句

    是否可以对我的sql SELECT语句的结果进行分组而不创建临时表以对一条语句进行求和和分组? 我有一张表格,保存贷方帐户号和借方帐户号的借方和贷方总额. 并为相反的字段输入零,我在下面的联合选择语句 ...

  2. mysql随机不连续数据_用MySQL里的Rand()生成 不连续重复 的随机数年龄以及随机姓名字符串...

    用MySQL里的Rand()生成 不连续重复 的随机数年龄以及随机姓名字符串 前言: RAND函数,返回在范围0到1.0内的随机浮点值.如果一个整数参数N被指定,它被用作种子值. 一,朋友问题描述如下 ...

  3. mysql如何防止插入重复数据_防止MySQL重复插入数据的三种方法

    新建表格 CREATE TABLE `person` ( `id` int NOT NULL COMMENT '主键', `name` varchar(64) CHARACTER SET utf8 C ...

  4. mysql是如何管理数据_【MySQL】如何管理数据库

    MySQL作为一款数据库管理系统(DataBase Management System,DBMS)软件,可以管理多个数据库.本文,主要讲述如何对一个数据库进行一系列的"增.删.改.查&quo ...

  5. 分布式从mysql查数据_技术分享 | 从库数据的查找和参数 slave_rows_search_algorithms...

    作者:高鹏 文章末尾有他著作的<深入理解MySQL主从原理 32讲>,深入透彻理解MySQL主从,GTID相关技术知识. 本文节选自<深入理解MySQL主从原理>第24节 注意 ...

  6. mysql 禁止插入重复数据_防止MySQL重复插入数据的三种方法

    新建表格 CREATE TABLE `person` ( `id` int NOT NULL COMMENT '主键', `name` varchar(64) CHARACTER SET utf8 C ...

  7. mysql binlog 大数据_后起之秀 | MySQL Binlog增量同步工具go-mysql-transfer实现详解

    一. 概述 工作需要研究了下阿里开源的MySQL Binlog增量订阅消费组件canal,其功能强大.运行稳定,但是有些方面不是太符合需求,主要有如下三点: 需要自己编写客户端来消费canal解析到的 ...

  8. mysql不停机迁移_不停服! 怎么迁移数据

    前言 数据迁移时, 为了保证数据的一致性, 往往伴随着停服, 此期间无法给用户提供服务或只能提供部分服务. 同时, 为了确保迁移后业务及数据的正确性, 迁移后测试工作也要占用不少时间. 如此造成的损失 ...

  9. mysql新增列并同时增加数据_图解MySQL | [原理解析] MySQL 为表添加列 是怎么quot;立刻quot;完成的...

    在上一期图解 图解MySQL | MySQL DDL为什么成本高?中,我们介绍了: 传统情况下,为表添加列需要对表进行重建 腾讯团队为 MySQL 引入了 Instant Add Column 的方案 ...

最新文章

  1. [专题总结]AC自动机
  2. 我早年在Google学到的10条经验
  3. CF858F Wizard's Tour 解题报告
  4. POJ 3498 March of the Penguins
  5. 嵌入式Linux的Qt
  6. 在服务器端生成Excel文件然后从服务器下载的本地的代码
  7. A remark on the error-backpropagation learning algorithm for spiking neural networks
  8. 马云:成功与情商有关 与读书多少关系不大
  9. java和python哪个运行速度快_为什么Python代码的运行速度比较慢呢?这会影响Python语言的扩张吗?...
  10. 快速突破面试算法之排序篇
  11. python分析html文件_如何用Python解析HTML?
  12. creo数控编程怎么样_世界一流数控编程软件,你都有了解过么?
  13. c# WPF中通过双击编辑DataGrid中Cell的示例(附源码)
  14. 通过JS检测360浏览器
  15. axio深入实例以及配置
  16. (完全解决)argparse中dest是什么意思
  17. 三天打鱼两天晒网C++
  18. SQLMAP插件tamper模块介绍
  19. opencv(c++)------图像分割(阙值、自适应阙值、grabCut、floodfill、wathershed)
  20. 那些关于程序员的段子

热门文章

  1. LVM原理及实现过程
  2. 编译器的普遍翻译步骤
  3. 隐藏Nginx和PHP版本号
  4. js中apply和Math.max()函数的问题?
  5. nginx error_log 错误日志配置说明
  6. python3 socks.wrap_module方法 针对单个模块进行代理设置
  7. linux shell 提取txt文件到数组
  8. tomcat关闭 异常报告
  9. linux iostat 命令 统计信息 cpu 块设备 分区 io
  10. curl: (25) Failed FTP upload: 550 解决办法