MySQL深入——9

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

我们来模拟在英语单词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.mzph.cn/news/604769.shtml

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

相关文章

基础数据结构第七期 Trie树

前言 Trie树大家能够掌握即可,其实用到的地方并不多,本文将为大家介绍一下。 一、Trie树的基本内容 1、根节点不包含字符,除根结点之外每一个结点都只包含一个字符; 2、字典树用边表示字母表示 3、从根节点到某一结点&#xff…

通过盲对抗性扰动实时击败基于DNN的流量分析系统

文章信息 论文题目:Defeating DNN-Based Traffic Analysis Systems in Real-Time With Blind Adversarial Perturbations 期刊(会议):30th USENIX Security Symposium 时间:2021 级别:CCF A 文章链接&…

Spring之代理模式

1、概念 1.1 介绍 二十三种设计模式中的一种,属于结构型模式。它的作用就是通过提供一个代理类,让我们在调用目标方法的时候,不再是直接对目标方法进行调用,而是通过代理类间接调用。让不属于目标方法核心逻辑的代码从目标方法中…

H266/VVC率失真优化与速率控制概述

率失真优化技术 率失真优化: 视频编码的主要目的是在保证一定视频质量的条件下尽量降低视频的编码比特率,或者在一定编码比特率限制条件下尽量地减小编码失真。在固定的编码框架下,为了应对不同的视频内容,往往有多种候选的编码方…

126基于matlab的孪生支持向量机(Twin support vector machine,TWSVM)是SVM的一种变形算法

基于matlab的孪生支持向量机(Twin support vector machine,TWSVM)是SVM的一种变形算法。该采用WSVM进行二分类,程序已注释数据可更换自己的,程序已调通,可直接运行。 126matlabTWSVM模式识别 (xiaohongshu.com)

【Python期末】动态爬取电影Top250数据可视化处理(有GUI界面/无数据库)

诚接计算机专业编程作业(C语言、C、Python、Java、HTML、JavaScript、Vue等),10/15R左右,如有需要请私信我,或者加我的企鹅号:1404293476 本文资源:https://download.csdn.net/download/weixin_47040861/88713693 目录…

模拟实现strlen函数的三种方法

本文介绍:模拟实现strlen函数的三种方法(指针相减,计数器,递归) 自我介绍:一个脑子不好的大一学生,c语言接触还没到半年,若涉及到效率等问题,各位都可以在评论区提出见解…

解决Typescript报错问题[亲测有效]

目录 1、安装 2、报错 3、分析 4、三种更新途径 如果你tsc -v报错,请看这篇文章,本人亲测有效! 1、安装 在前端项目中使用TS,需要进行安装,命令为:npm install -g typescript 查看TS版本: …

网关Gateway

什么是网关? 网关实质上是一个网络通向其他网络的 IP 地址,是当前微服务项目的"统一入口"。 网关能做什么? 反向代理 、鉴权、 流量控制、 熔断、 日志监控等 图片原文:http://t.csdnimg.cn/SvUJh 核心概念 Router(…

AArch64 memory management学习(一)

提示 该博客主要为个人学习,通过阅读官网手册整理而来(个人觉得阅读官网的英文文档非常有助于理解各个IP特性)。若有不对之处请参考参考文档,以官网参考文档为准。AArch64 memory management学习一共分为两章,这是第一…

GD32 支持IAP的bootloader开发,使用串口通过Ymodem协议传输固件(附代码)

资料下载: https://download.csdn.net/download/wouderw/88714985 一、概述 关于IAP的原理和Ymodem协议,本文不做任何论述,本文只论述bootloader如何使用串口通过Ymodem协议接收升级程序并进行IAP升级,以及bootloader和主程序两个工程的配置…

【算法提升】LeetCode每五日一总结【01/01--01/05】

文章目录 LeetCode每五日一总结【01/01--01/05】2023/12/31今日数据结构&#xff1a;二叉树的前/中/后 序遍历<非递归> 2024/01/01今日数据结构&#xff1a;二叉树的 前/中/后 序遍历 三合一代码<非递归>今日数据结构&#xff1a;二叉树的 前/中/后 序遍历 三合一代…

Windows系统任务栏应用图标显示成空白的解决方案

背景 任务栏应用图标为空白&#xff1a; 原因 Windows系统为了加快系统响应速度&#xff0c;在安装完应用第一次显示完应用图标后&#xff0c;会将应用的图标放入缓存中&#xff0c;以后每次显示应用直接在缓存中获取&#xff0c;如果缓存中的图标信息发生错误&#xff0c;…

09-责任链模式-C语言实现

责任链模式&#xff1a;Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it.&#xff08;使多个对象都有…

Java学习苦旅(二十三)——二叉搜索树

本篇博客将详细讲解二叉搜索树。 文章目录 二叉搜索树概念操作查找插入删除 性能分析 结尾 二叉搜索树 概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根…

java数据结构与算法刷题-----LeetCode64. 最小路径和

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 很多人觉得动态规划很难&#xff0c;但它就是固定套路而已。其实动态规划只…

最新ChatGPT网站系统源码+详细搭建部署教程+Midjourney绘画AI绘画

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Ch…

CogVLM多模态大模型训练代码详细教程(基于vscode调试与训练)

文章目录 前言一、cogvlm环境安装1、apex问题2、en_core_web_sm问题 二、launch.json文件配置1、finetune_cogvlm_lora.sh被配置内容2、launch.json文件配置3、debug调试展示 三、训练源码解读1、权重问题2、数据问题3、训练模型参数修改4、训练源码解读5、训练结果展示 前言 …

认识Git

&#x1f30e;初识Git 初识Git 什么是Git Git的安装       Centos平台安装Git       Ubuntu平台安装Git Git的基本操作       创建远程仓库       配置Git 认识工作区、暂存区与版本库       添加文件到暂存区       将暂存区文件提交至本…

weak_ptr如何能做到解决循环引用又能传递参数呢?

引子&#xff1a;今天在看CLR via C#的时候看到C#的垃圾回收算法--引用跟踪算法的时候想到以下几个问题。 一、引用计数法存在的问题 一般引用计数法存在的问题就是不好处理循环引用的问题&#xff0c;但是C不是有weak_ptr吗&#xff1f; 这个引用跟踪的垃圾回收算法看起来还…