iis服务器助手广告
返回顶部
首页 > 资讯 > 数据库 >MySQL中的随机抽取的实现
  • 194
分享到

MySQL中的随机抽取的实现

MySQL随机抽取 2023-03-20 10:03:38 194人浏览 泡泡鱼
摘要

目录1. 引言2. 内存临时表3. 磁盘临时表4. 优先队列排序算法1. 引言 现在有一个需求是从一个单词表中每次随机选取三个单词。 这个表的建表语句和如下所示: Mysql> Create table 'Word

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实战45讲笔记

到此这篇关于MySQL中的随机抽取的实现的文章就介绍到这了,更多相关MySQL 随机抽取内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

您可能感兴趣的文档:

--结束END--

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

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL中的随机抽取的实现
    目录1. 引言2. 内存临时表3. 磁盘临时表4. 优先队列排序算法1. 引言 现在有一个需求是从一个单词表中每次随机选取三个单词。 这个表的建表语句和如下所示: mysql> Create table 'word...
    99+
    2023-03-20
    MySQL 随机抽取
  • MySQL中的随机抽取如何实现
    今天小编给大家分享一下MySQL中的随机抽取如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 引言现在有一个需求是...
    99+
    2023-07-05
  • Pandassample随机抽样的实现
    随机抽样,是统计学中常用的一种方法,它可以帮助我们从大量的数据中快速地构建出一组数据分析模型。在 Pandas 中,如果想要对数据集进行随机抽样,需要使用 sample() 函数。 ...
    99+
    2024-04-02
  • Numpy随机抽样的实现
    目录前言一、随机模块二、离散型随机变量二项分布计算期望和方差三、连续型随机变量四、正态分布五、指数分布其他随机函数前言 numpy.random 模块对 Python 内置的 ran...
    99+
    2023-03-02
    Numpy随机抽样 Numpy随机
  • mysql中怎么随机抽取一定数量的记录
    本篇文章为大家展示了mysql中怎么随机抽取一定数量的记录,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1.order by rand()写法:SELECT...
    99+
    2024-04-02
  • C语言实现随机抽取纸牌程序
    本文实例为大家分享了C语言实现随机抽取纸牌的具体代码,供大家参考,具体内容如下 程序设计要求 本程序负责发一副标准纸牌,每张标准纸牌都有一种花色(梅花、方块、黑桃、红桃)和一个等级(...
    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
  • Numpy随机抽样如何实现
    这篇文章主要介绍了Numpy随机抽样如何实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Numpy随机抽样如何实现文章都会有所收获,下面我们一起来看看吧。前言numpy.random 模块对 Python 内...
    99+
    2023-07-05
  • C语言如何实现随机抽取纸牌程序
    本篇内容主要讲解“C语言如何实现随机抽取纸牌程序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言如何实现随机抽取纸牌程序”吧!程序设计要求本程序负责发一副标准纸牌,每张标准纸牌都有一种花色(...
    99+
    2023-06-29
  • 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
  • vue组件封装实现抽奖随机数
    本文实例为大家分享了vue组件封装实现抽奖随机数的具体代码,供大家参考,具体内容如下 一、子组件 <template>     <div>      <...
    99+
    2024-04-02
  • shell如何随机从文件中抽取若干行
    这篇文章将为大家详细讲解有关shell如何随机从文件中抽取若干行,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。shuf -n5 main.txtsort -R main.txt | head -5awk ...
    99+
    2023-06-09
  • java简单随机抽奖功能怎么实现
    实现简单的随机抽奖功能可以使用Java的Random类来生成随机数。下面是一个简单的实现示例:```javaimport java....
    99+
    2023-08-31
    java
  • C语言怎么实现随机抽奖程序
    要实现随机抽奖程序,可以按照以下步骤进行:1. 导入头文件:```c#include #include #include ```2....
    99+
    2023-08-18
    C语言
  • MySQL中如何实现随机恢复
    这篇文章给大家介绍MySQL中如何实现随机恢复,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1)数据库参数配置不规范,/etc/my.cnf和/data/mysql_xxx/my.cn...
    99+
    2024-04-02
  • MySQL中怎么实现随机恢复
    MySQL中怎么实现随机恢复,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。关于随机恢复,最近做了一些改进和整理,发现有些细节的工作比想象中要复...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作