mysql随机数生原理 mysql实现原理和机制

渴望登顶的登山者不会被沿途的足迹所陶醉。1前言如下,我这里有一个问题记录表。我需要从列表中随机选择4条数据,所以我会这样写(随机排序,取前4条)执行时间6.73秒,绝对不能容忍。你知道这个过程中发生了什么吗???MySQL 2的随机查询进程内存临时表select * from questio...

渴望登顶的登山者不会被沿途的足迹所陶醉。

1前言

如下,我这里有一个问题记录表。


我需要从列表中随机选择4条数据,所以我会这样写(随机排序,取前4条)


执行时间6.73秒,绝对不能容忍。你知道这个过程中发生了什么吗???

MySQL 2的随机查询进程内存临时表

select * from question_extracting order by rand() limit 4

上面这句话先随机排序,然后取前四项。其执行过程如下:

第一步 创建一个临时表,有两个字段,一个是double 类型使用A表示,另一个是 varchar(***) 类型 使用B表示,记为 字段 W,需要注意的是这个表没有建索引。第二步就是 从 上述 question_extracting 表中,按主键顺序取出所有的行(因为这里需要的是每行的所有数据),对于每一行数据,调用 rand() 函数生成一个大于 0 小于 1 的随机小数,并把这个随机小数和这一行数据 分别存入临时表的 A 和 B 字段中,需要扫描全表,如这里的 4974098 行。第三步就是在临时表中按照字段 A 排序,初始化 sort_buffer,sort_buffer 中会放两个字段,一个是 double 类型,用来放临时表中的 A 字段,另一个是整型,用来放临时表中对应的数据的行号。第四步就是在 sort_buffer 中根据 A 的值进行排序,排序完成后,取出前 4 个结果的位置信息,然后回到依次到内存临时表中取出 对就的行信息 值,返回给 客户端。

在上面的过程中,第二步扫描了整个question_extracting表的4974098行,第三步也扫描了临时表的4974098行,然后最后一步扫描了4行数据得到数据,所以这个查询总共扫描了4974098 +4974098+4次。

在上面的过程中,order by rand()使用了临时内存表,在对临时内存表进行排序时使用了rowid排序方法。这个临时表没有主键ID,临时生成的长度为6字节的rowid作为主键。

MySQL 3的rand查询进程盘临时表

在MySql中,参数tmp_table_size限制了临时内存表的大小,默认值为16M。如果临时表的大小超过了tmp_table_size,那么临时内存表将被转换为临时磁盘表。

当使用临时磁盘表时,可以在没有显式索引的情况下对InnoDB表进行排序。

在这个过程中,使用了MySQL版引入的优先级队列排序算法。例如,我们随机选择上面提到的值。根据优先级队列排序算法,我们只需要取出临时表中最小的四个A值对应的数据。这个过程可以简要描述如下:

第一步 对于临时表中这 4974098 个准备排序的 (A,rowid),先取前四行,构造成一个堆(可以理解为一个组)第二步 取下一个行 (R’,rowid’),跟当前堆里面最大的 R 比较,如果 R’小于 R,把这个 (R,rowid) 从堆中去掉,换成 (R’,rowid’)重复第 2 步,直到第 4974098 个 (R’,rowid’) 完成比较最后一步就是 拿到这最小的4个值后,回到临时表中取出对应的数据。

3 MySQL随机排序的正确姿势

随机取一段数据,在开头写下如下内容:

随机算法的正确姿态


你没看错,这是正确的写法。

select ***x(id),min(id) into @A,@B from question_extracting ;set @C= floor((@A-@B+1)*rand() + @B);select * from question_extracting where id >= @C limit 1;

可以描述如下:

第一步 取得这个表的主键 id 的最大值 M 和最小值 N,这个过程不需要扫描表第二步 用随机函数生成一个最大值到最小值之间的数 C = (A-B)*rand() + B;第三步 取不小于 C 的第一个 ID 的行

结束

不局限于思维和语言的限制才是编程的最高境界。

推荐:MySql。真的可以用字符串索引吗?

本文来自无言温柔天然对象投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/570822.html

打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
() 0
上一篇 05-31
下一篇 05-31

相关推荐

  • 范围内随机数公式excel Excel生成随机数操作教学

    随机数在我们的工作中也很常见,但是如何在Excel中生成随机数来得到我们需要的随机数呢?一、生成一个0到1之间的随机数。方法:在目标单元格中输入公式:=RAND()。二。生成1到10之间的随机数。方法:在目标单元格中输入公式:=RANDBETWEEN(1,10)。三。生成一个10到100之间的随机

    2023-06-05 09:32:01
    385 0
  • mysql随机数生原理 mysql实现原理和机制

    渴望登顶的登山者不会被沿途的足迹所陶醉。1前言如下,我这里有一个问题记录表。我需要从列表中随机选择4条数据,所以我会这样写(随机排序,取前4条)执行时间6.73秒,绝对不能容忍。你知道这个过程中发生了什么吗???MySQL 2的随机查询进程内存临时表select * from questio

    2023-05-31 08:12:01
    420 0
  • html随机数生成器 html随机选数代码介绍

    用量子计算模拟器ProjectQ生成随机数,并用pytest进行单元测试与覆盖率测试,以及基于flake8的编码规范测试目录技术背景随机数的应用量子计算与随机数基于pytest的python单元测试框架量子计算产生随机数注意!!!pytest测试安装pytest库pytest单元测试用例撰写pytest初始化配

    2023-05-15 21:32:01
    660 0
  • 数字随机生成器(随机数生成器)

    乍看之下,电子游戏、**和密码学似乎没有任何关系,但实际上,它们都使用“随机数”,没有随机数,现代人的生活就无法构建。这篇文章将解释计算机如何产生这样的随机数。生成随机数比你想象的难多了!例如,如果您想在编程中使用随机数,请使用Ruby中的“rand”或Python中的“

    2023-04-17 17:42:01
    141 0

评论列表

联系我们

在线咨询: QQ交谈

邮件:admin@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信