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进行拼接后输出。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python - 操作 docx

文章目录 使用库 : python-docx 官方文档:https://python-docx.readthedocs.io 安装 pip install python-docx提取 docx from docx import Documentdoc Document(file_path) text "" for para in doc.paragraphs:text para.text "\n"创建…

gazebo模型库目录(国内源)

这个是比较普遍的,一般用途: GitCode - 开发者的代码家园https://gitcode.com/geniusChinaHN/osrf.gazebo_models/tree/master/ambulance这个主要是车辆: car_demo: osrf汽车模型库https://gitee.com/geniuschinahn/car_demo还有这个是以前…

深入理解 Flink(八)Flink Task 部署初始化和启动详解

JobMaster 部署 Task 核心入口: JobMaster.onStart();部署 Task 链条:JobMaster --> DefaultScheduler --> SchedulingStrategy --> ExecutionVertex --> Execution --> RPC请求 --> TaskExecutor TaskExecutor 处理 JobMaster 的 …

一文玩转Go语言中的面向对象编程~

温故而知新:什么是面向对象 面向对象(Object-Oriented)是一种计算机编程的方法和思想,它将程序中的数据(对象)和操作(方法)组织成一个个相互关联和交互的对象。对象是现实世界中的事…

SpringBoot 配置文件加载优先级

SpringBoot 配置文件加载优先级 前言SpringBoot 配置文件加载优先级 前言 最近在使用k8s部署项目的时候,发现Dockerfile文件中的命令后面跟的参数,无法覆盖nacos中的参数,今天有时间正好来整理一下Springboot配置的加载顺序 SpringBoot 配置文件加载优先级 整理加载顺序第一个肯…

vue中动态给不同表单赋值

这里的业务是通过关联的 id 发送不同的请求获取表单的数据,然后回显到页面中,整个的页面是由多个表单拼接起来的 点击下一步的时候,获取下一个表单的内容。 // 查询getForm(index) {switch (index) {case 0:this.getFromInfo("inputFor…

软件测试之项目立项与需求评审

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢软件测试面试题分享: 1000道软件测试面试题及答案📢软件测试实战项目分享: 纯接口项目-完…

Elasticsearch 快速入门指南【总结记录】

本文将介绍一些基本概念,帮助您快速入门使用Elasticsearch。 一、概述 ES用来解决什么问题?Elasticsearch是解决海量数据(已经存在的数据)全文检索的不二只选。 Elasticsearch是一个基于Java语言开发,建立在开源搜索…

XSS的利用(包含:蓝莲花、beef-xss)

0x00、环境搭建 dvwa靶场 操作指南和最佳实践:使用 DVWA 了解如何防止网站漏洞_dvwa源代码-CSDN博客 xss漏洞接收平台 下载:GitHub - firesunCN/BlueLotus_XSSReceiver 将解压后的BlueLotus_XSSReceiver原代码放置 phpstudy 安装目录的WWW文件夹下 访问平台:http://127…

计算机缺失msvcp120.dll的最新解决方法,实测可以完美修复

在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是“msvcp120.dll丢失”。msvcp120.dll是Microsoft Visual C Redistributable Package的一部分,它是运行许多基于Windows操作系统的应用程序所必需的动态链接库文件之一。如果计算机…

笔试面试题——继承和组合

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、什么是菱形继承?菱形继承的问题是什么?二、什么是菱形虚拟继承&am…

xcode安装及运行源码

抖音教学视频 目录 1、xcode 介绍 2、xcode 下载 3、xocde 运行ios源码 4、快捷键 1、xcode 介绍 Xcode 是运行在操作系统Mac OS X上的集成开发工具(IDE),由Apple Inc开发。Xcode是开发 macOS 和 iOS 应用程序的最快捷的方式。Xcode 具有…

Linux上如何一键安装软件?yum源是什么?Linux如何配置yum源?

这几个问题是Linux操作的入门问题,但是确实也会让刚上手Linux小伙伴头疼一阵,故特有此文,希望能对刚入门的小伙伴有一些帮助~ 众所周知 在linux上在线安装软件需要用到yum命令,经常下述命令来安装 yum install [-y] 包名 #-y的…

Python 全栈体系【四阶】(十三)

第四章 机器学习 十六、模型评估与优化 1. 模型评估 1.1 性能度量 1.1.1 错误率与精度 错误率和精度是分类问题中常用的性能度量指标,既适用于二分类任务,也适用于多分类任务。 错误率(error rate):指分类错误的样…

NowinAndroid—2024 Android现代开发全功能应用

NowinAndroid—2024 Android现代开发全功能应用 现代Android开发全功能示例应用Now-in-Android,它是用Kotlin和Jetpack Compose开发的,功能非常强大。这个应用遵循了安卓设计和开发的最佳方法,旨在给开发者提供实用的参考资料。无论你是新手…

做饭这些事:工程师用热风枪来烤鸡翅~

作为一枚合格的工程师,经常会重点关注如何用自身本领及工具来处理事情,其中之一便是做饭!工程师人才济济,区区做饭这些事,So Easy!下面将分享如何用热风枪制作一盆香喷喷的烤鸡翅~ 1、准备工作首先&#xf…

计算机系统(软考版)----计算机系统基础知识、基本单位与进制(1)

文章目录 计算机系统基础知识一 硬件组成二 CPU功能三 CPU组成运算器控制器寄存器组 练习题(答案为加粗部分) 计算机基本单位与进制一 计算机基本单位二 进制1 概述2 进制转换3 进制加减 练习题(答案为加粗部分) 计算机系统基础知…

Rust 最新版1.75.0升级记

升级方法 稳定版 C:\>rustup update stable info: syncing channel updates for stable-x86_64-pc-windows-msvc info: latest update on 2023-12-28, rust version 1.75.0 (82e1608df 2023-12-21) info: downloading component cargo 5.9 MiB / 5.9 MiB (100 %) 3.…

C#超市管理系统源码

C#超市管理系统源码 功能齐全的超市管理系统,专门美化过UI 请先附加数据库,否则无法进入系统 默认拥有最高权限账户为经理,密码为admin 压缩包内有使用说明

Postman接口测试神器从安装到精通

Postman 的优点: 支持各种的请求类型: get、post、put、patch、delete 等支持在线存储数据,通过账号就可以进行迁移数据很方便的支持请求 header 和请求参数的设置支持不同的认证机制,包括 Basic Auth,Digest Auth,OAu…