首页 > 数据库 >2023高效的mysql 随机语句 200万数据为例 用了 0.0030秒

2023高效的mysql 随机语句 200万数据为例 用了 0.0030秒

时间:2023-04-16 14:34:00浏览次数:40  
标签:200 记录 为例 随机 2023 RAND id SELECT 10

是的,如果数据表中有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条记录。

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

标签:200,记录,为例,随机,2023,RAND,id,SELECT,10
From: https://www.cnblogs.com/yuesha/p/17316668.html

相关文章

  • 2023-3-16 #45 花花绿绿的色块勉勉强强拼凑成
    这是之前的博客。鸽了一年的ZYLOI终于举办了!讲完题的一刻,感觉心中的大石头终于落下来了!265P9150邮箱题很不错的题!!分置换环考虑,我们将一个置换环上的结点重新编号为\(1,2,\cdots,n\),倍长后断环为链。我们尝试维护若干条有序的链,每条链由一些点双连成。从后往前扫描每个点,......
  • 深度分析Palantir的投资价值,Palantir2023年将实现强劲反弹?
    在本文中,猛兽财经将通过对Palantir的股票关键指标、商业模式、盈利能力、影响Palantir2023年股价的关键利好因素等方面,对Palantir进行全面、深度的分析。Palantir股票的关键指标自从Palantir(PLTR)的股价在2021年1月25日大幅上涨至35.18美元后,其股价就开始下跌,并在2022年底下跌到了......
  • 2023年春面向对象第二单元
    23年春面向对象第二单元分析与总结目录概述JVM基础  JVM简介  JVM内存结构  java类的加载机制  JVM结构与多线程的关联架构  电梯  调度器  类图分析  对任务要求的回答bug分析总结概述  OO第二单元主要围绕着java多线程编程展开。在理论部分,课......
  • COMS3200 网络编程
    COMS3200Assignment12023S1100totalmarks,25%overallcoursemarkDue:15:0019April20231Preface1.1NotesThisdocumentissubjecttochangeforthepurposesofclarification.Changesmadesincetheoriginalreleasewillbehighlightedinred.Please......
  • 2023.15 人工智能训练师
    AI在消灭一些职业岗位的同时,也会带来一些新的岗位,人工智能训练师就是其中之一。2020年,「人工智能训练师」正式成为新职业并纳入国家职业分类目录,是指「使用智能训练软件,在人工智能产品实际使用过程中进行数据库管理、算法参数设置、人机交互设计、性能测试跟踪及其他辅助作......
  • 2023年4月16日09:03:49
    昨天就画了软件工程的图,其他没有干。昨天的画图过程中有一个问题,就是自己没有很专注的去画图,不然那个图应该可以早点完成。现在你的SpringBoot又学完了一遍,什么叫有,但没办法,确实是又,但我学的很快,也学到了很多跟以前不一样的东西,现在我又有一个个人“规律那就是我不断的学,不断的......
  • 2023.4.16
    1#include<iostream>2usingnamespacestd;3//设计圆类和点类,判断点和圆的关系4classPoint5{6public:7voidsetX(intx)8{9m_X=x;10}11intgetX()12{13returnm_X;14}15voidsetY(inty)......
  • 免费的HwBasicLib4S7-200Smart组件库
    HwBasicLib是我们旗下的通用组件库,目前包含了S7-1200/1500+TIAWinCC和经典WinCC等多款产品。今天介绍的是其中的一款HwBasicLib4S7-200Smart组件库。该库是从最开始的HwBasicLib4S7-200组件库升级而来。因为我们已经有好几年不再使用S7-200Smart这款PLC了,所以决定把它免费。......
  • 2023年Rust发展如何?
    1.引言Rust是一种系统编程语言,它注重安全、并发和内存效率。自2010年首次发布以来,Rust一直在快速发展,吸引了越来越多的开发者加入其社区。Rust语言的设计目标是提供一种安全、并发和实用的语言,它可以满足系统编程的需求,同时也适用于其他领域。2.Rust在2022年的发展趋势在202......
  • day46(2023.4.15)
    1.多表查询 2.迪卡尔乘积 3.等值连接 4.非等值连接 5.自连接 6.99交叉连接 7.99自然连接 8.99内连接 9.外连接查询 10.多表查询,连接小练习 day46(2023.4.15)......