返回顶部
首页 > 资讯 > 数据库 >MySQL中的随机抽取如何实现
  • 393
分享到

MySQL中的随机抽取如何实现

2023-07-05 14:07:41 393人浏览 八月长安
摘要

今天小编给大家分享一下MySQL中的随机抽取如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 引言现在有一个需求是

今天小编给大家分享一下MySQL中的随机抽取如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

1. 引言

现在有一个需求是从一个单词表中每次随机选取三个单词。

这个表的建表语句和如下所示:

Mysql> Create table 'Words'(    'id' int(11) not null auto_increment;    'word' varchar(64) default null;    primary key ('id')) ENGINE=InnoDB;

然后我们向其中插入10000行数据。接下来我们看看如何从中随机选择3个单词。

2. 内存临时表

首先,我们通常会想到用order by rand()来实现这个逻辑:

mysql> select word from words order by rand() limit 3;

虽然这句话很简单,但是执行流程则比较复杂。我们使用explain来看看语句的执行情况:

MySQL中的随机抽取如何实现

Extra字段中Using temporary表示需要使用临时表,Using filesort表示需要进行排序。也就是需要进行排序操作。

对于InnoDB表来说,执行全字段排序能够减少对于磁盘的访问,所以会被优先选择。

MySQL中的随机抽取如何实现

而对于内存表来说,回表过程只是简单地根据数据行的位置,直接访问内存得到数据,根本不会导致多访问磁盘。所以这时Mysql会优选选择rowid排序。

MySQL中的随机抽取如何实现

我们接下来再来梳理下这条语句的执行流程:

  • 创建一个临时表,这个表使用memory引擎,表里有两个字段,第一个字段是double类型,记为R,第二个字段是varchar(64)类型,记为W。并且这个表没有索引

  • 从words表中,按主键顺序取出所有的word。对于每个word,调用rand()函数随机生成一个大于0小于1的随机小数,并把这个随机小数和word分别存入临时表的R和W字段中。

  • 接下来就是按照字段R进行排序

  • 初始化sort_buffer。sort_buffer有两个字段,一个是double类型,另一个是整型。

  • 从内存临时表中一行行取出R值和位置信息,分别存入sort_buffer的两个字段里。

  • sort_buffer按照R值进行排序

  • 排序完成后,取出前三个结果的位置信息,到内存临时表中取出相应的word,返回给客户端。

流程示意图如下所示:

MySQL中的随机抽取如何实现

上面讲的位置信息,其实就是行所在的位置,也就是我们之前说的rowid。

对于InnoDB引擎来说,对于有没有主键表来说有两种处理方式:

  • 对于有主键的InnoDB表来说,这个rowid就是主键id

  • 对于没有主键的InnoDB表来说,这个rowid是由系统生成的,用来标识不同行。

因此,order by randn()使用了内存临时表,内存临时表的排序方法用的是rowid排序方法

3. 磁盘临时表

不是所有的临时表都是内存临时表。tmp_table_size这个配置限制了内存临时表的大小,如果超过了这个大小,就会使用磁盘临时表。InnoDB引擎就是默认使用磁盘临时表

4. 优先队列排序算法

在MySQL5.6之后,引入了优先队列排序算法,这种算法是不需要使用临时文件的。而原本的归并排序算法则是需要使用临时文件。

因为当你使用归并算法的时候,其实你只需要得到前3,但是你是用完归并排序,那已经整体有序了,造成了资源的浪费。

而优先队列排序算法则可以只取到前三,执行流程如下:

  • 对于这10000个准备排序的(R,rowid),先取前三行,构造成一个堆,并且将最大的值放在堆顶;

  • 取下一行(R’,rowid’),跟当前堆里面最大的R比较,如果R’小于R,则把(R,rowid)从堆中去掉,换成(R’,rowid’)。

  • 不断重复上面的过程。

流程如下图所示:

MySQL中的随机抽取如何实现

但是当limit的数比较大时,维护堆比较困难,所以又会使用归并排序算法。

以上就是“MySQL中的随机抽取如何实现”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网数据库频道。

您可能感兴趣的文档:

--结束END--

本文标题: MySQL中的随机抽取如何实现

本文链接: https://lsjlt.com/news/352159.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL中的随机抽取如何实现
    今天小编给大家分享一下MySQL中的随机抽取如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 引言现在有一个需求是...
    99+
    2023-07-05
  • MySQL中的随机抽取的实现
    目录1. 引言2. 内存临时表3. 磁盘临时表4. 优先队列排序算法1. 引言 现在有一个需求是从一个单词表中每次随机选取三个单词。 这个表的建表语句和如下所示: mysql> Create table 'word...
    99+
    2023-03-20
    MySQL 随机抽取
  • mysql随机抽取数据
      -- 慢 SELECT * FROM table_name ORDER BY rand() LIMIT 5; -- 较慢 SELECT * FROM `table` WHERE id >= (SEL...
    99+
    2020-09-09
    mysql随机抽取数据
  • Numpy随机抽样如何实现
    这篇文章主要介绍了Numpy随机抽样如何实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Numpy随机抽样如何实现文章都会有所收获,下面我们一起来看看吧。前言numpy.random 模块对 Python 内...
    99+
    2023-07-05
  • C语言如何实现随机抽取纸牌程序
    本篇内容主要讲解“C语言如何实现随机抽取纸牌程序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言如何实现随机抽取纸牌程序”吧!程序设计要求本程序负责发一副标准纸牌,每张标准纸牌都有一种花色(...
    99+
    2023-06-29
  • Pandassample随机抽样的实现
    随机抽样,是统计学中常用的一种方法,它可以帮助我们从大量的数据中快速地构建出一组数据分析模型。在 Pandas 中,如果想要对数据集进行随机抽样,需要使用 sample() 函数。 ...
    99+
    2024-04-02
  • Numpy随机抽样的实现
    目录前言一、随机模块二、离散型随机变量二项分布计算期望和方差三、连续型随机变量四、正态分布五、指数分布其他随机函数前言 numpy.random 模块对 Python 内置的 ran...
    99+
    2023-03-02
    Numpy随机抽样 Numpy随机
  • shell如何随机从文件中抽取若干行
    这篇文章将为大家详细讲解有关shell如何随机从文件中抽取若干行,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。shuf -n5 main.txtsort -R main.txt | head -5awk ...
    99+
    2023-06-09
  • C语言实现随机抽取纸牌程序
    本文实例为大家分享了C语言实现随机抽取纸牌的具体代码,供大家参考,具体内容如下 程序设计要求 本程序负责发一副标准纸牌,每张标准纸牌都有一种花色(梅花、方块、黑桃、红桃)和一个等级(...
    99+
    2024-04-02
  • shell 随机从文件中抽取若干行的实现方法
    shuf -n5 main.txt sort -R main.txt | head -5 awk -vN=5 -vC="`wc -l file`" 'BEGIN{srand();while(n<N){...
    99+
    2022-06-04
    文件 方法 shell
  • mysql中怎么随机抽取一定数量的记录
    本篇文章为大家展示了mysql中怎么随机抽取一定数量的记录,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1.order by rand()写法:SELECT...
    99+
    2024-04-02
  • MySQL中如何实现随机恢复
    这篇文章给大家介绍MySQL中如何实现随机恢复,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1)数据库参数配置不规范,/etc/my.cnf和/data/mysql_xxx/my.cn...
    99+
    2024-04-02
  • python—从list中随机抽取元素
    1、随机抽取一个元素 from random import choicel = [1, 2, 3, 4, 5, 6, 7, 8, 9]print(choice(l)) choice(seq): C...
    99+
    2023-10-20
    python
  • vue组件如何封装实现抽奖随机数
    今天小编给大家分享一下vue组件如何封装实现抽奖随机数的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、子组件<tem...
    99+
    2023-06-29
  • MySQL中Datax如何实现离线数据抽取
    这篇文章将为大家详细讲解有关MySQL中Datax如何实现离线数据抽取,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Datax下载地址:https://github.co...
    99+
    2024-04-02
  • Python+random模块实现随机抽样
    目录1. 设置随机数种子 seed()2. random() 与 randint()3. sample()方法 无放回抽样4. choice() 与 choices() 有放回抽样5...
    99+
    2024-04-02
  • JS实现随机抽奖小功能
    本文实例为大家分享了JS实现随机抽奖小功能的具体代码,供大家参考,具体内容如下 点击开始按钮开始抽奖,div依次变红!下面是js代码,需要的自取 <script>    ...
    99+
    2024-04-02
  • C语言实现随机抽奖程序
    本文实例为大家分享了C语言实现抽奖小程序的具体代码,供大家参考,具体内容如下 #include<stdio.h> #include<stdlib.h> #...
    99+
    2024-04-02
  • python随机抽奖系统怎么实现
    要实现一个Python随机抽奖系统,可以按照以下步骤进行:1. 导入random模块,用于生成随机数。```pythonimport...
    99+
    2023-08-16
    python
  • MySQL中怎么实现在表中取出随机数据
    本篇文章为大家展示了MySQL中怎么实现在表中取出随机数据,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。  如何在MySQL实现表中取出随机数据  SELEC...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作