是的,如果数据表中有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. django_静态文件

    **************************************************************************************************** ...

  2. VS中多字节字符集和UNICODE字符集的使用说明

    两者的核心区别: 1.在制作多国语言软件时,使用Unicode(UTF-16,16bits,两个字节).无特殊要求时,还是使用多字节字符集比较好. 2.如果要兼容C编程,只能使用多字节字符集.这里的兼 ...

  3. Linux调用python文件的同时传参

    创建python文件内容如下: 计算两个数相加并打印,需要传递两个参数 vi sum.py import sys def calc(a,b): c=a+b return c a1=int(float( ...

  4. js 字符串和16进制的互相转换(转)

    字符串转16进制 function strToHexCharCode(str) { if(str === "") return ""; var hexCharC ...

  5. 4.javaweb-thymeleaf

    1.知识回顾: 1. post提交方式下的设置编码,防止中文乱码 request.setCharacterEncoding("utf-8"); get提交方式,tomcat8开始, ...

  6. mysql-单行处理函数

    1 单行处理函数 lower() 对于输出转换成小写 upper()对于输出转换成大写 substr()取子字符串 下标从1开始 length() 去长度 concat()将字符串进行拼接 例:将首字 ...

  7. 记一次FusionCompute安装springboot应用过程

    客户给了一个地址,登录后发现是FusionCompute 的一个虚拟机,第一次使用,于是过了一下在线帮助文档 ,大概明白了. 因为客户已经创建完了裸机虚拟机,前面的过程我也不会太多关注. 在概要里,可 ...

  8. JSON常见用法

    https://blog.csdn.net/weixin_43631296/article/details/105253434

  9. MFC 错误调试总结

    1.  msdia80.dll can not be loaded 该文件的路径应该是:C:\Program Files\Common Files\microsoft shared\VC\msdia8 ...

  10. Android笔记--Application

    Application生命周期 在APP运行过程中有且仅有一个Application对象贯穿整个生命周期 Application全局变量 实例化: 声明全局变量: