是的,如果数据表中有200万条记录,使用 ORDER BY RAND() 这种方式来随机选择记录会非常慢,因为 MySQL 需要对整个表进行排序,然后再返回指定数量的记录。这个过程需要消耗大量的时间和资源。

为了提高效率,可以考虑使用其他方法来实现随机选择记录。以下是一些常用的方法:

  1. 使用 WHERE 子句限制记录数量,然后再使用 ORDER BY RAND() 进行随机排序。例如:

    SELECT * FROM table_name WHERE id >= RAND() * (SELECT MAX(id) FROM table_name) LIMIT 10;

    这个语句会先计算出一个随机的 id 值,然后选择 id 大于等于这个值的记录,并按照随机顺序返回前10条记录。

  2. 使用 LIMIT 子句和 OFFSET 子句来分页查询记录,然后随机选择其中的一页。例如:

    SELECT * FROM table_name LIMIT 1000000, 10000;

    这个语句会选择从第1000000条记录开始的10000条记录,并按照默认顺序返回。然后可以在这10000条记录中随机选择指定数量的记录。

  3. 使用 HASH 函数来生成随机数,然后根据这个随机数选择记录。例如:

    SELECT * FROM table_name WHERE MOD(CONV(SUBSTRING(MD5(CONCAT(id, RAND())), 1, 16), 16, 10), 100) = 0 LIMIT 10;

    这个语句会先将每条记录的 id 和一个随机数拼接起来,然后计算出一个 MD5 值,并取这个值的前16个字符。然后将这个字符串转换成一个10进制数,并对100取模,得到一个0到99之间的随机数。最后,选择这个随机数等于0的记录,并返回前10条记录。

以上是一些常用的方法,可以根据实际情况选择合适的方法来实现随机选择记录。

除了上述提到的方法,还有一些其他的方法可以实现高效的随机选择记录。以下是一些常用的方法:

  1. 使用 JOIN 子句和 RAND() 函数来随机选择记录。例如:

    SELECT t1.* FROM table_name t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM table_name)) AS id) AS t2 WHERE t1.id >= t2.id ORDER BY t1.id ASC LIMIT 10;

    这个语句会先计算出一个随机的 id 值,然后选择 id 大于等于这个值的记录,并按照 id 升序排序。最后返回前10条记录。

  2. 使用 UNION 子句和 RAND() 函数来随机选择记录。例如:

    (SELECT * FROM table_name WHERE id >= RAND() * (SELECT MAX(id) FROM table_name) ORDER BY id ASC LIMIT 10) UNION (SELECT * FROM table_name WHERE id < RAND() * (SELECT MAX(id) FROM table_name) ORDER BY id DESC LIMIT 10);

    这个语句会先计算出一个随机的 id 值,然后选择 id 大于等于这个值的记录,并按照 id 升序排序,返回前10条记录。然后选择 id 小于这个值的记录,并按照 id 降序排序,返回前10条记录。最后将这两个结果合并起来,返回20条记录。

  3. 使用 SUBSTRING_INDEX 函数和 RAND() 函数来随机选择记录。例如:

    SELECT * FROM table_name WHERE id >= SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(RAND(), RAND(), RAND()), '.', 2), '.', -1) * (SELECT MAX(id) FROM table_name) ORDER BY id ASC LIMIT 10;

    这个语句会先生成一个随机的小数值,然后选择 id 大于等于这个值的记录,并按照 id 升序排序,返回前10条记录。

以上是一些常用的方法,可以根据实际情况选择合适的方法来实现随机选择记录。需要注意的是,这些方法都有一定的局限性,可能不适用于所有情况。在实际应用中,需要根据具体的需求和数据量来选择合适的方法。

2023高效的mysql 随机语句 200万数据为例 用了 0.0030秒的更多相关文章

  1. **高效的MySql 随机读取数据

    一直以为mysql随机查询几条数据,就用 SELECT * FROM `table` ORDER BYRAND() LIMIT 5 就可以了. 但是真正测试一下才发现这样效率非常低.一个15万余条的库 ...

  2. mysql随机取出n条数据

    SELECT * FROM  tableName  ORDER BY  RAND() LIMIT n      数据量小的话还可以, 数据量大起来了, 就影响性能了. $rubbish = (new ...

  3. MySQL select语句直接导出数据

    select * into outfile '文件存放路径' from 表名; (先记下来,还未测试)

  4. MYSQL 随机选取几条数据

    SELECT * FROM tablename AS r1 JOIN (SELECT ROUND(RAND() *(SELECT MAX(id)FROM tablename)) AS id) AS r ...

  5. Mysql 随机查询10条数据效率最快的查询方法

    1)使用join 和 rand() 耗时 0.009 SELECT * FROM `t_topic` AS t1 JOIN ( SELECT ROUND( RAND() * ( (SELECT MAX ...

  6. 转: 从Mysql某一表中随机读取n条数据的SQL查询语句

    若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1)).例如, 若要在7 到 12 的范围(包括7和12)内得到一个随机 ...

  7. 从Mysql某一表中随机读取n条数据的SQL查询语句

    若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1)).例如, 若要在7 到 12 的范围(包括7和12)内得到一个随机 ...

  8. mysql随机查询记录的高效率方法

    mysql使用rand随机查询记录的高效率方法 一直以为mysql随机查询几条数据,就用 SELECT * FROM `table` ORDER BY RAND() LIMIT 5 就可以了. 但是真 ...

  9. 如何实现MySQL随机查询数据与MySQL随机更新数据?

    以下的文章主要介绍的是MySQL随机选取数据,对实现MySQ随机查询数据与MySQ随机更新数据的实际操作步骤的描述,以及对其实际操作中所要用到的语句的描述,以下就是对其具体操作步骤的描述. MySQL ...

  10. mysql 随机查询 记录集

    有时候需求需要随机从数据库查询若干条记录集,网上搜了一下,几篇博文都是些重复的.....不知道他们谁抄的谁的,这里除了介绍提供一种笔者自己想到的方法,本质都是利用mysql 的rand() 第一种方法 ...

随机推荐

  1. aop的一些方注释介绍

    //定义切入点 @Pointcut("execution(void com.itheima.dao.BookDao.update())") private void pt2(){} ...

  2. linux软件安装篇

    nginx篇 第一件事情 cd /etc/yum.repo.d mv CentOS-Base.repo CentOS-Base.repo.bak wget -O CentOS-Base.repo ht ...

  3. vue input有值但还是验证不通过

    验证失败原因: 因为input自动把输入的值转换为string类型,导致验证失败. 解决方案: 一. Input中的v-model改为v-model.number: 二.rules里面需要加type: ...

  4. 本地项目导入svn托管

  5. win10下Word点击链接跳转,提示“由于本机的限制,该操作已取消”

    Word按住Ctrl点击链接进行跳转,提示"由于本机的限制,该操作已取消,请联系管理员" 网上很多,修改注册表 这边要说的是,修改重启word ,还不行的解决方法:点开任务管理器- ...

  6. 使用python来搭建一个简易的文件下载环境以及用droopy来实现一个文件上传环境

    ubuntu在安装的时候一般都是自带python环境的,大家可以查看一下查看demo如下 用于共享的命令很简单python2: python -m SimpleHTTPServer 8888pytho ...

  7. NFS存储安装配置

    一.NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种, 它允许网络中的计算机之间通过TCP/IP网络共享资源.在NFS的应用中,本地NFS的客 户 ...

  8. Arduino优化 减少重复代码 例2

    Example->Blink: void setup() { pinMode(LED_BUILTIN, OUTPUT); } void loop() { digitalWrite(LED_BUI ...

  9. binder机制分析

    1. binder基本概念 1.1 特点 1)binder 是一种基于C/S通信模式的IPC(Inter_Process Communication). 2)在传输过程中近需要一次copy,为发送添加 ...

  10. Linux中profile、bashrc、bash_profile之间的区别和联系(转)

    /etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.并从/etc/profile.d目录的配置文件中搜集shell的设置. 英文描述为: # /etc/pr ...