MySQL深入——8

Order by语句是如何工作的?

首先我们来创建一个表

CREATE TABLE `t` (`id` int(11) NOT NULL,`city` varchar(16) NOT NULL,`name` varchar(16) NOT NULL,`age` int(11) NOT NULL,`addr` varchar(128) DEFAULT NULL,PRIMARY KEY (`id`),KEY `city` (`city`)
) ENGINE=InnoDB;

全字段排序 

 scelect city, name ,age from t where city="杭州" order by name limit 1000;

为了避免全表扫描,我们需要给city加上一个索引,然后使用explain语句去查询,其中extra这个字段中的“using filesort”表示需要排序。

 Mysql对其分配出一块内存用于排序,内存成为sort_buffer,city=杭州找出来后,初始化sort_buffer放入city name id这三个字段,对sort_buffer中的name字段进行快速排序,取出前1000行返回给客户端。

按照name排序,可能在内存当中完成,也可能需要外部排序,这取决于所需内存及其参数sort_buffer_size,当name太大的时候,内存放不下,就得使用外部排序进行,就是Mysql开辟sort_buffer_size的大小。

那么如何判断一个文件是否使用了临时文件呢??

optimizer_trace='enabled=on'

开启优化跟踪,Mysql开启追踪查询优化器的决策过程,记录有关优化器如何选择执行计划的详细信息,information_schema是一个特殊的数据库,这个数据库存储了关于数据库,表,列,索引,权限等方面的信息,允许用户查询和了解数据库的结构和状态。

使用这个查询中number_of_tmp_files表示的是排序过程中使用临时文件数,那么为什么使用了12个临时文件呢,Mysql将其分为12份,每一份单独排序后存在于临时文件中,再将12个有序文件合并成为一个有序的大文件。

如果sort_buffer_size超过了需要排序的数据量大小,number_of_tmp_files的数值就为0,表示可以在内存中进行排序。

否则就需要在外部排序,sort_buffer_size 越小,需要分成的份数越多,number_of_tmp_files就越大。

rowid排序

在全排序当中,是对原表的数据读了一遍,剩下的操作都是在sort_buffer和临时表当中执行的,但是这存在着一个问题,就是当查询的时候要返回很多字段的时候,sort_buffer当中要存放的字段数太多,这样内存当中能同时放下的行数就很少,这样要分为很多个临时文件,排序的时候性能会很差,所以我们来使用rowid排序来解决这种问题。

当Mysql认为排序的单行长度太大的时候会采用另外一种算法即为rowid算法。流程是这样的,初始化sort_buffer确定放入两个字段name 和id。从索引city当中取出满足city=“杭州”的主键id,然后从这个主键id中取出整行,取出id和name存入sort_buffer,然后接着重复从索引city中取出满足条件的主键id,直到不满足为止。

因为只要排序的列name字段和主键id,少了city和age字段的值,不能直接返回了。存的是主键id的顺序,到时候遍历排序结果,取前1000行,并按照id的值到原表当中取出city,name和age三个字段返回客户端。

这样的话需要进行排序的内存就会变小,相应的临时文件也相应的变小了。

比较

Mysql在担心内存不够用的时候会使用第二种算法来进行排序,但是会增加磁盘访问,因为第二次返回值的时候,是从主键当中再次访问原表返回的,这就体现出来Mysql的一个思想:如果内存够就多利用内存,减少磁盘访问。

我们还可以使用覆盖索引和联合索引来解决,其实并不是所有的order by语句都要进行排序操作的,Mysql之所以要生成临时表做排序操作,是因为原来所有的数据都是无序的,但是如果它天然就是按照name递增排序的呢?

覆盖索引是指,索引上的信息足够满足查询请求,不需要再回到主键索引上去取数据。

按照这个概念,我们创建一个name ,city ,age 的联合索引,因为name是递增天然的,我们就不需要排序直接返回了,直到city不为杭州的时候结束。使用这个的时候,我们可以看extra下面的字段显示是不是需要排序来决定。因为不是每一个查询都能使用上覆盖索引,就需要把所有的字段都建立起联合索引,因为索引的维护也是有代价的,所以这是一个需要权衡的决定。

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

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

相关文章

Python实战演练之python实现神经网络模型算法

python实现神经网络模型算法 今天,厾罗和大家分享用Python实现神经网络模型算法,仅用于技术学习交流。 实现技巧 1.导入依赖库 主要是安装相关的依赖库。本文实现的环境为:python 3.7。 from __future__ import division import math …

C语言联合体

联合体 联合体联合体基本概念联合体特点联合体内存结构图 联合体 联合体基本概念 联合体概念: 结构体(struct)是一种结构体类型或者复杂类型,它可以包含多个类型不同的成员另外一种和结构体非常类似的类型,叫做联合…

GPT-4 变懒了?官方回复

你是否注意到,最近使用 ChatGPT 的时候,当你向它提出一些问题,却得到的回应似乎变得简短而敷衍了?对于这一现象,ChatGPT 官方给出了回应。 译文:我们听到了你们所有关于 GPT4 变得更懒的反馈!我…

低多边形3D建模动画风格纹理贴图

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时,有几种不同的风格&#xf…

【Linux】make/Makefile --- 自动化构建项目的工具

目录 一、make/Makefile的简单使用 二、Makefile 的语法规则 三、实现的原理 3.1 make/Makefile识别文件新旧 3.2 .PHONY修饰的伪目标总是被执行 3.3 make/Makefile是具有依赖性的推导能力的 四、语法技巧 五、注意事项 Linux中自动化构建项目最简单的方式:…

Nginx基础篇:Nginx搭建、Nginx反向代理、文件服务器部署配置。

Nginx Linux系统安装以及反向代理的配置 简介优点nginx 环境安装常用Nginx 命令nginx 文件服务器搭建 简介 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点…

LabelImg的使用及注意事项

LabelImg是一款开源的图像标注工具,它主要用于标注目标检测、语义分割和图像分类等深度学习中需要的数据集。通过使用LabelImg,用户可以快速、准确地为图片中的目标添加标注信息,从而建立数据集。 使用步骤: 下载LabelImg&#x…

我的创作纪念日(2周年)

机缘 在进入大学之前,完全没有听说过CSDN,第一次使用CSDN应该是搜C语言如何学,或者是和C语言相关的其他内容 因为我本人是学计算机专业的,大一刚开学因为疫情延迟了开学时间,老师线上教课,但是我之前是完…

永磁同步电机反电动势系数怎么算?磁链强度怎么算?转矩系数怎么算?

在进行永磁同步电机simulink仿真时,一个关键参数就是永磁体磁链强度, 实际上在simulink中,永磁体磁链强度/反电动势系数/转矩系数这三个是放一起的,这是因为他们都可互相算出来。 Torque constat (Nm/A) 转矩系数 1.5 * Np *…

Tomcat部署开源站点JPress

前言 JPress使用Java开发,是我们常见的开源博客系统。JPress是一个开源的WordPress插件,它提供了一个简单而强大的方式来创建企业级站点。该插件包括许多特性,例如主题定制、页面构建器、性能优化、SEO、安全、电子商务和社交媒体整合等。使用…

thinkphp6入门(12)-- 一对一关联模型

定义一对一关联,例如,一个用户都有一个个人资料。 一、两表 1.用户表:user 2.工作经验表:work_experience user表的id关联work_experience表的user_id。 注意看,user_id1的有2条工作经验 二、数据模型 主表模型:…

STM32F407-14.3.9-02输出比较模式

输出比较模式 输出比较模式生成波形时 当采用上升沿或下降沿计数时,更改ARR的值可改变周期; 更改CCRx的值会影响到生成波形的相位。波形的占空比永远50% 当采用中心对齐模式时, 更改ARR的值可以改变周期,更改CCRx的值可以改…

操作系统考研笔记(王道408)

文章目录 前言计算机系统概述OS的基本概念OS的发展历程OS的运行机制OS体系结构OS引导虚拟机 进程和线程进程和线程基础进程进程状态进程控制进程通信线程线程实现 CPU调度调度的层次进程调度细节调度算法评价指标批处理调度算法交互式调度方法 同步与互斥基本概念互斥互斥软件实…

Plantuml之类图语法介绍(十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

STM32基于USB串口通信应用开发

✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进, 代码获取、问题探讨及文章转载可私信。 ☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。 🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!…

对无向图进行邻接矩阵的转化,并且利用DFS(深度优先)和BFS(广度优先)算法进行遍历输出, 在邻接矩阵存储结构上,完成最小生成树的操作。

一 实验目的 1.掌握图的相关概念。 2.掌握用邻接矩阵和邻接表的方法描述图的存储结构。 3.掌握图的深度优先搜索和广度优先搜索遍历的方法及其计算机的实现。 4.理解最小生成树的有关算法 二 实验内容及要求 实验内容&#…

模电·放大电路的分析方法——图解法

放大电路的分析方法——图解法 静态工作点的分析电压放大倍数的分析波形非线性失真的分析直流负载线与交流负载线图解法的适用范围 在实际测出放大管的输入特性、输出特性和已知放大电路中其它各元件参数的情况下,利用作图的方法对放大电路进行分析即为图解法。 静…

postgresql自带指令命令系列三

目录 简介 bin目录 28.pg_verifybackup 29.pg_waldump 30.postgres 31.postmaster -> postgres 32.psql 33.reindexdb 34.vacuumdb 35.vacuumlo 总结: 简介 在安装postgresql数据库的时候会需要设置一个关于postgresql数据库的PATH变量 export PATH/…

Linux CentOS 7.6安装jdk1.8教程

安装教程 第一种方式(通过yum安装):第一步:输入查找命令:第二步:输入安装命令:第三步:安装完成,输入安装命令后,等到出现Complete!代表安装完成第…

PyTorch实现逻辑回归

最终效果 先看下最终效果: 这里用一条直线把二维平面上不同的点分开。 生成随机数据 #创建训练数据 x torch.rand(10,1)*10 #shape(10,1) y 2*x (5 torch.randn(10,1))#构建线性回归参数 w torch.randn((1))#随机初始化w,要用到自动梯度求导 b …