《MYSQL 实战45讲》深入浅出ORDER BY底层

news2024/10/28 20:35:18

慢查询日志这个路径下,但是打不开

内存临时表

现在有一个业务功能是从一个单词表里面随机选出3个单词出来

这个表有10000条数据。

select word from words order by rank() limit 3

使用执行计划查看结果:

select_type是SIMPLE表示改查询不包含子查询或者UNION

type:all,表示性能是最差的,没有使用索引,全表扫描

rows:扫描的行数9980

filtered:

Extra:额外信息,这里的Extra是Using temporary表示使用了临时表;using filesort表示需要执行排序操作

对于内存临时表,排序算法会选择全字段排序还是rowid排序?

如果是innodb的磁盘临时表,排序算法会考虑到使用rowid会多一次回表的过程,所以在内存足够大时会尽量选择全字段排序,但是内存临时表不同,rowid排序需要回表时,不需要去磁盘,而是直接访问内存就能拿到rowid对应的完整整行的值,所以对于内存临时表,会选择rowid排序,因为少占用一点内存。

执行流程:

1.首先创建内存临时表,有2个字段(double型)R和(varchar型)W,无索引

2.将每一行记录的word取出来并使用rank函数生成随机小数(大于0并且小于1)分别放在内存临时表的R和W字段。此时已经扫描了10000行数据存在内存临时表,然后需要对这个临时表对R字段进行排序

3.初始化sort_buffer要放2个字段,一个double类型,一个整型

4.一行一行取出内存临时表的R和“位置信息”放在sort_buffer中,此时又扫描了10000行,总共扫描了20000行

5.在sort_buffer中对R的值进行排序,此处不会增加扫描的行数

6.排序完成后,将排序结果的前3条数据的“位置信息”取出来并在内存临时表中取出对应的word放入结果集,返回客户端 。此时又扫描了3行,总扫描行数是20003

rowid排序的rowid是什么意思?

就是MYSQL用来唯一标识数据行的信息。

对于innodb的表来说:

表如果有主键id,那么rowid就是主键id

表如果没有主键id,那么rowid就是系统生成的。

对于这个内存临时表来说:

整个表就相对于一个数组,数组中每个元素就是一个数据行,所以这个rowid就是数组的下标。

前面提到的位置信息就是这个数组下标


 

磁盘临时表

1.在排序时有一个参数是sort_buffer_size控制的是用来排序的内存大小,如果要排序的数据量总大小小于sort_buffer_size,就直接在内存中快排,否则就要使用磁盘临时文件来辅助进行归并排序(先让每个文件中的数据是有序的,再合并所有文件)。

2.而在使用order by rand()时使用的表,也有内存临时表和磁盘临时表之分,通过tmp_table_size参数来控制,这个参数配置的是内存临时表的大小,超过这个大小就只能用磁盘临时表了,而这个磁盘临时表默认是innodb引擎的,就和我们平时打交道的表是一样的,只不过这个磁盘临时表没有索引。

我们通过设置参数使MYSQL选择磁盘临时表:

但是发现临时文件数是0,说明没有使用到临时文件,原因是MySQL 5.6引入了优先队列,sort_buffer大小允许的情况下会使用优先队列来进行“排序”,因为这个语句要的是前3个,如果使用归并或者快排,都会让10000条数据全部有序,显然没有必要并且浪费很多资源,所以使用优先队列去维护一个最大堆,每遍历一个数据行就将rand值与最大堆的最大值比较,如果小于这个最大值就把rand值替换进去,最大堆的堆顶永远是堆中的最大值。

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

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

相关文章

USB Type-C 受电端取电快充协议芯片,支持PD+QC+FCP+SCP+AFC快充协议

前言 随着科技的飞速发展,电子设备对于快速充电的需求日益增加。为了满足这一需求,市场上涌现出了众多快充技术和产品。其中,XSP08Q诱骗取电芯片以其卓越的性能和广泛的应用场景,成为了快充领域的一颗璀璨明星。本文将对XSP08Q P…

边缘计算网关在储能领域的应用-天拓四方

随着全球能源结构的转型和智能电网的快速发展,储能技术已成为推动能源革命的关键技术之一。在储能系统中,边缘计算网关作为一种新型的网络设备,发挥着至关重要的作用。 一、边缘计算网关在储能领域的应用 1、实时监控与控制 储能系统是一个…

hf_transformers-Quantization

bitsandbytes BitSandbytes 是将模型量化为 8 位和 4 位的最简单选项。8 位量化将 FP16 中的异常值与 INT8 中的非异常值相乘,将非异常值转换回 FP16,然后将它们相加以返回 FP16 中的权重。这减少了离群值对模型性能的降级影响。4 位量化进一步压缩模型…

【小白学机器学习22】 多变量分析:相关性分析,多变量回归,最小二乘法 ols等

目录 1 概念名词: 1.1 双变量分析与单因素分析 1.2 变化 1.3 共变 和 相关分析 Correlation analysis 1.4 回归分析 Regression analysis 1.5 相干和相关 1.5.1 相干relevant 1.5.2 相关Correlation 2 双变量分析 3 相关分析 3.1 是否相关 3.2 相关的…

Ping32为何是理想的加密工具?十大核心功能保障您的数据安全

在当今数字化时代,数据安全已成为企业和个人面临的重大挑战。随着信息泄露事件的频繁发生,选择一款可靠的加密工具至关重要。Ping32 作为一款备受赞誉的加密软件,以其十大核心功能,成为保障数据安全的理想选择。 一、强大的加密算…

React第十一章(useReducer)

useReducer useReducer是React提供的一个高级Hook,没有它我们也可以正常开发,但是useReducer可以使我们的代码具有更好的可读性,可维护性。 useReducer 跟 useState 一样的都是帮我们管理组件的状态的,但是呢与useState不同的是 useReducer…

JsonCpp库学习记录

使用源码的方式 到JsonCpp的开源库仓库下载最新的发行版本 解压压缩包 使用Python生成源码文件 在本路径下cmd打开控制台,使用python编译(前提是python环境已安装) python amalgamate.py 生成dist文件夹 jsoncpp为整合在一起的源码&#…

vue 解决:npm ERR! code ERESOLVE 及 npm ERR! ERESOLVE could not resolve 的方案

1、问题描述: 其一、需求为: 想要安装项目所需依赖,成功运行 vue 项目,想要在浏览器中能成功访问项目地址 其二、问题描述为: 在 package.json 文件打开终端平台,通过执行 npm install 命令&#xff0c…

6,000 个网站上的假 WordPress 插件提示用户安装恶意软件

黑客使用窃取的凭证感染 WordPress 网站,并向其发送虚假插件,通过虚假的浏览器更新提示向最终用户发送恶意软件和信息窃取程序。 该恶意活动基于ClickFix假浏览器更新恶意软件的新变种,自 2024 年 6 月以来已使用假 WordPress 插件感染了超过…

QT 机器视觉 1.相机类型

本专栏从实际需求场景出发详细还原、分别介绍大型工业化场景、专业实验室场景、自动化生产线场景、各种视觉检测物体场景介绍本专栏应用场景 更适合涉及到视觉相关工作者、包括但不限于一线操作人员、现场实施人员、项目相关维护人员,希望了解2D、3D相机视觉相关操作…

【问题解决】pnpm : 无法将“pnpm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

今天配置完poetry环境变量之后pnpm不能用了 具体报错 pnpm : 无法将“pnpm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。 所在位置 行:1 字符: 1pnpm run dev~~~~ Ca…

【加密系统】华企盾DSC服务台提示:请升级服务器,否则可能导致客户端退回到旧服务器的版本

华企盾DSC服务台提示:请升级服务器,否则可能导致客户端退回到旧服务器的版本 产生的原因:控制台版本比服务器高导致控制台出现报错 解决方案 方法:将控制台回退到原来的使用版本,在控制台负载均衡查看连接该服务器各个…

若依框架部署到服务器后头像资源访问404

排错过程 第一开始以为是代理出问题了 官网给出的解决方案 第一种是用代理后端接口,第二种是重写路径直接访问静态文件 接口通过捕获profile开头的路径/profile/avatar…,转为/home…/avatar找到我们在该路径下的文件 但是我想了一下,我ngin…

基于Flink搭建流式湖仓OpenLake方案

OpenLake解决方案建立在开放可控的OpenLake湖仓之上,提供大数据搜索与AI一体化服务。通过元数据管理平台DLF管理结构化、半结构化和非结构化数据,提供湖仓数据表和文件的安全访问及IO加速,并支持大数据、搜索和AI多引擎对接。本文为您介绍以F…

windows下使用nvm进行多版本nodejs管理

目录 一:背景 二:nvm的介绍 三:环境切换使用 一:背景 最近在开发node js的项目,其中一个项目的前端和后台使用了两个node版本,因此需要不同的环境配置来进行开发任务,刚好nvm这个插件可以实现…

探索三维世界的奥秘:如何在Cesium中实现惊艳的双面渲染效果

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

掌握未来技术:KVM虚拟化安装全攻略,开启高效云端之旅

作者简介:我是团团儿,是一名专注于云计算领域的专业创作者,感谢大家的关注 座右铭: 云端筑梦,数据为翼,探索无限可能,引领云计算新纪元 个人主页:团儿.-CSDN博客 目录 前言&#…

RabbitMQ的Overview Totals是空

一、问题描述 RabbitMQ 版本:4.0.2,Erlang 版本:26.2.5.4。 RabbitMQ 页面管理(rabbitmq_management)的 Overview > Totals 是空: 二、原因分析 RabbitMQ 的配置: management_agent.disable_metrics_collector…

从0到1学习node.js(express模块)

文章目录 Express框架1、初体验express2、什么是路由3、路由的使用3、获取请求参数4、电商项目商品详情场景配置路由占位符规则5、小练习,根据id参数返回对应歌手信息6、express和原生http模块设置响应体的一些方法7、其他响应设置8、express中间件8.1、什么是中间件…

轻松部署自己的AI聊天助手LocalGPT并实现无公网IP远程交互

文章目录 前言环境准备1. localGPT部署2. 启动和使用3. 安装cpolar 内网穿透4. 创建公网地址5. 公网地址访问6. 固定公网地址 前言 本文主要介绍如何本地部署LocalGPT并实现远程访问,由于localGPT只能通过本地局域网IP地址端口号的形式访问,实现远程访问…