MySQL深入——9

news2024/11/16 13:02:27

如何正确的显示随机信息?

我们来模拟在英语单词app当中随机出现三个英语单词的情况,我们首先创建一张表words,然后给这个表当中插入10000条信息进行量化。

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

order by rand()就是随机取三个的意思,接着我们使用Explain语句来看看这个命令,发现他要进行排列而且要创建临时表,对于优化器来说,是处理的行数越少越好,就使用了rowid排序进行,rowid排序(https://blog.csdn.net/Cobrander2_0/article/details/134861949icon-default.png?t=N7T8https://blog.csdn.net/Cobrander2_0/article/details/134861949)就是先创建一张临时表出来,从words表当中按照主键顺序取出主键,然后使用rand()对每一个主键进行操作得到他们特有的数字存入到临时表当中,现在这个临时表当中存在10000条数据了,然后初始化sort_buffer,将这个数字和主键存入,这个过程当中遍历了一遍临时表扫描行数变成20000,接着在sort_buffer当中对数字进行排序,然后输出前三个,扫描行数变成了20003。

在这个过程当中生成了临时表,并且表排序的时候使用了rowid方法。

那么是不是所有的临时表都是内存表?其实不然,tmp_table_size限制了内存临时表的大小,当超过他的大小限制的时候,就会转化为磁盘临时表,当变为磁盘临时表的时候,执行上面的语句,也会变得不一样,我们会发现它使用的临时文件变为0了,这是因为他并没有使用并归排序算法,而是优先队列排序算法。

优先队列排序

我们现在的SQL语句是需要三个值的,但是我们对全表都进行了排序,这浪费了很多的计算量,而优先队列算法可以精确的只得到三个值,简单的来说就是使用了堆,取出10000行的前三行构成一个堆,然后取出下一行与这个堆里面的最大值进行比较,如果下一行的值小于这个堆里面的最大值,就对他进行替换,接着重复这一步直到结尾。

但是为什么我们上面的语句并没有使用到优先队列排序呢?这是因为使用这个算法的话,对堆维护的大小就是10000行的(name,rowid),超出了设置的sort_buffer_size值,所以只能使用rowid算法。

总之不管使用什么类型的临时表,order by rand()这个写法都耗费了巨大的资源。

那么有没有什么方法可以让耗费的资源变小呢???

随机排序方法

mysql> select count(*) into @C from t;
set @Y = floor(@C * rand());
set @sql = concat("select * from t limit ", @Y, ",1");
prepare stmt from @sql;
execute stmt;
DEALLOCATE prepare stmt;

我们首先使用count*来将这个表当中的行数C确定下来,接着使用floor和rand()方法取出来一个随机的0~C的整数Y,然后使用concat(是一个字符串连接函数,用于将多个字符串合并成一个字符串)将Y行当中的信息取出并输出,这个句子的意思是构建一个SQL查询,该查询从表 t 中选取一定数量的行。@Y 变量决定了从哪一行开始选取。

MySQL处理limit Y,1 的做法就是按顺序一个一个地读出来,丢掉前Y个,然后把下一个记录作为返回结果,因此这一步需要扫描Y+1行。再加上,第一步扫描的C行,总共需要扫描C+Y+1行。这个代价是要小于前面的order by rand()语句的。

prepare stmt from @sql;

这段代码的目的是从 @sql 变量中获取SQL查询字符串,并准备一个预处理语句。预处理语句是一种优化的方式,用于执行相同的SQL查询多次,而不需要每次都重新解析和编译查询。这样可以提高执行效率。

在准备好预处理语句后,可以使用 execute stmt 命令来执行它。执行完毕后,使用 deallocate prepare stmt 命令来释放预处理语句。

如果要输出三个单词,就找到三个Y值,然后在表当中取出这个Y行,接着使用concat进行拼接后输出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1369106.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【炼丹神器】wandb实践之sweep超参扫描工具

文章目录 一、四步上手wandb二、四步玩转sweep 参考官方文档:https://docs.wandb.ai/guides/sweeps/define-sweep-configuration 一、四步上手wandb 首先,wandb其实类似tensorboard,mindinsight,都是观察训练时的学习率&#xff0…

pyqt调用UI和开启子进程

UI制作 qrc 注意调用UI前把样式表里绑定的资源(qrc)转换成py导入进去 xxx.qrc转xxx.py 两种方法 1命令 pyrcc5 -o icons_rc.py icons.qrc 2外部工具pyrcc 实参 -o $FileNameWithoutExtension$.py $FileNameWithoutExtension$.qrcsdz.qrc→→sdaz.py 在代码里写 import…

Hyperledger Fabric 二进制安装部署 Peer 节点

规划网络拓扑 3 个 orderer 节点;组织 org1 , org1 下有两个 peer 节点, peer0 和 peer1; 组织 org2 , org2 下有两个 peer 节点, peer0 和 peer1; 节点宿主机 IPhosts端口cli192.168.1.66N/AN/Aorderer0192.168.1.66orderer0.example.com70…

前端面试题集合一

Canvas是什么?怎样写Canvas? Canvas是HTML5的一个元素,它使用JavaScript在网页上绘制图形。Canvas是一个矩形区域。它的每一个像素都可以由HTML5语言来控制。使用Canvas绘制路径、框、圆、字符和添加图像有几种方法。 如果要在我们的HTML文…

2024年跨境电商上半年有哪些营销节日?

2024年伊始,跨境电商开启新一轮的营销竞技,那么首先需要客户需求,节假日与用户需求息息相关,那么接下来小编为大家整理2024上半年海外都有哪些节日和假期?跨境卖家如何见针对营销日历选品,助力卖家把握2024…

Spring——Spring AOP1(代理模式Proxy)

代理(Proxy)模式 1.创建工程 2.代理(Proxy)模式介绍 作用:通过代理可以控制访问某个对象的方法,在调用这个方法前做前置处理,调用这个方法后做后置处理。(即: AOP的微观…

Redis小计(4)

目录 1.Set和Get操作 2.mset和mget 3.mset,mget,set后加参数的优点 4.incr,incrby,incrbyfloat 1.Set和Get操作 flushall:清除所有k-v键值对。(删库跑路小技巧) set k v[ex | px]:设置超时…

Elementui Radio单选框取消选中

问题: 最近开发一个后台项目的时候用到了单选框,而客户的要求是默认选择一个选项,然后点击可以取消选中。不想自己在手写一个Radio组件,只能在elementui的单选框上修改一下下啦。 1. .native的作用 .native的作用是在给组件添加修…

低代码开发平台在工业领域的应用场景

随着科技的不断发展,低代码开发平台在工业场景中的应用越来越广泛。低代码开发平台通过提供可视化的界面和预构建的模块,使得开发人员能够快速地构建应用程序,而不需要编写大量的代码。这种技术的应用,不仅可以提高开发效率&#…

网络安全之你的浏览器记录真的安全吗?

密码是每个人最私密的东西,轻易是不会展示给他人的,那么我如何能知道你电脑上浏览器里保存的密码呢?浏览器是大家在网上冲浪最常用的软件,在登录一些网站填写账号密码后,浏览器为了方便大家使用,会提示是否…

ArrayList 与 LinkedList 区别?

如果你现在需要准备面试,可以关注我的公众号:”Tom聊架构“,回复暗号:”578“,领取一份我整理的50W字面试宝典,可以帮助你提高80%的面试通过率,价值很高!! 是否保证线程安…

「PyMuPDF 专栏 」PyMuPDF创建PDF、拆分PDF

文章目录 一、本章前言二、使用PyMuPDF创建PDF文档1、实例代码2、过程详解①. 安装PyMuPDF②. 导入PyMuPDF模块③. 创建一个新的PDF文档④. 添加页面和内容⑤. 保存文档 三、使用PyMuPDF拆分PDF文档1、实例代码2、过程解析①. 导入模块②. 定义函数③. 打开源PDF文件④. 遍历页…

openGauss学习笔记-189 openGauss 数据库运维-常见故障定位案例-TPCC-WAL-内存

文章目录 openGauss学习笔记-189 openGauss 数据库运维-常见故障定位案例-TPCC-WAL-内存189.1 TPCC运行时,注入磁盘满故障,TPCC卡住的问题189.1.1 问题现象189.1.2 原因分析189.1.3 处理分析 189.2 备机处于need repair(WAL)状态问题189.2.1问题现象189.…

jquery 合并table表格行或列

合并行 $("#tableId").find("tr").each(function(rowIndex) {var cells $(this).find("td");cells.each(function(cellIndex) {var cell $(this);var prevRowCell table.find("tr:eq(" (rowIndex - 1) ")").find(&quo…

CUDA:执行模型

SM 在SM中,共享内存和寄存器是非常重要的资源。共享内存被分配在SM上的常驻线程 块中,寄存器在线程中被分配。线程块中的线程通过这些资源可以进行相互的合作和通 信。 warp CUDA采用单指令多线程(SIMT)架构来管理和执行线程&am…

Agisoft Metashape 3D模型重建

Agisoft Metashape 3D模型重建 文章目录 Agisoft Metashape 3D模型重建前言一、添加照片二、对齐照片三、构建网格四、构建纹理五、导出模型六、上传数据前言 本文介绍利用Agisoft Metashape,构建3D模型的基本工作流程。下文以无人机单镜头防地飞行数据为例,通过Agisoft Met…

百川智能发布角色大模型 ,零代码复刻角色轻松满足游戏领域定制需求

2024年1月9日,百川智能发布角色大模型Baichuan-NPC,深度优化了“角色知识”和“对话能力”,使模型能够更好的理解上下文对话语义,更加符合人物性格地进行对话和行动,让角色栩栩如生。此外,对于游戏领域AI角…

Python - Bert-VITS2 自定义训练语音

目录 一.引言 二.前期准备 1.Conda 环境搭建 2.Bert 模型下载 3.预训练模型下载 三.数据准备 1.音频文件批量处理 2.训练文件地址生成 3.模型训练配置生成 4.训练文件重采样 5.Tensor pt 文件生成 四.模型训练 1.预训练模型 2.模型训练 3.模型收菜 五.总结 一…

Flask修改Response Headers中的Server值

Headers中的Server会暴露出Python版本,导致的结果就是方便被渗透快速定位Python版本后找到对应版本的漏洞,因此导致网络安全问题 伪方法: 像这个马上就暴露出Python版本,如何解决这个网络上有说直接用response.headers.remove(Ser…

STL标准库与泛型编程(侯捷)笔记6(完结)

STL标准库与泛型编程(侯捷) 本文是学习笔记,仅供个人学习使用。如有侵权,请联系删除。 参考链接 Youbute: 侯捷-STL标准库与泛型编程 B站: 侯捷 - STL Github:STL源码剖析中源码 https://github.com/SilverMaple/STLSourceCo…