MySQL数据库基础知识7,查询的执行过程

news2024/11/16 9:26:52

目录

    • 一、拆分查询
    • 二、分解关联查询
    • 三、查询的执行过程
    • 四、优化器的一些优化手段
      • 1、重新定义关联表的顺序
      • 2、将外连接转化为内连接
      • 3、使用增加变换规则
      • 4、优化count()、max()、min()
      • 5、预估并转化为常量表达式
      • 6、覆盖索引扫描
      • 7、提前终止查询
    • 五、MySQL如何执行关联查询
    • 六、查询执行引擎
    • 七、分页
      • MySQL进阶实战系列文章
      • 哪吒精品系列文章

一、拆分查询

将大查询拆分成小查询,每个查询功能完全一样,只是一小部分,每次只返回一小部分查询结果。

比如在删除旧数据的时候,如果用一个大的语句一次性删的话,则可能需要一次性锁住很多数据、占满整个事务日志、耗尽系统资源、阻塞其它查询任务。如果将一个大的删除语句拆分成若干个较小的删除语句,可以提升MySQL的性能。一次删除一万行数据一般来说是一个比较高效并且对服务器影响最小的做法。

二、分解关联查询

分解关联查询的优势

  1. 让缓存更高效,如果某个表改变了,就无法使用查询缓存了,而拆分后,如果其它表没变化,那么基于这些表的查询就可以使用缓存结果了;
  2. 将查询分解后,执行单表查询时可以减少锁的竞争;
  3. 在应用层做关联,可以更容易对数据进行拆分,更容易做到高性能和高扩展;
  4. 查询本身的效率也可能会提升;
  5. 可以减少冗余记录的查询

三、查询的执行过程

  1. 客户端发送一条查询语句到服务器
  2. 服务器先查询缓存,如果命中缓存,则立即返回存储在缓存中的数据;
  3. 未命中缓存后,MySQL通过关键字将SQL语句进行解析,并生成一颗对应的解析树,MySQL解析器将使用MySQL语法进行验证和解析。例如,验证是否使用了错误的关键字,或者关键字的使用是否正确;
  4. 预处理是根据一些MySQL规则检查解析树是否合理,比如检查表和列是否存在,还会解析名字和别名,然后预处理器会验证权限;
  5. 根据执行计划查询执行引擎,调用API接口调用存储引擎来查询数据;
  6. 将结果返回客户端,并进行缓存;
    在这里插入图片描述
    多数连接MySQL的库函数都可以获得全部结果集并缓存在内存中,还可以逐行获取需要的数据。默认一般是获得全部结果集并缓存到内存中。MySQL通常需要等所有的数据都已经发送给客户端才能释放这条查询所占用的资源,所以接收全部结果并缓存通常可以减少服务器的压力,让查询能够早点结束,早点释放相应的资源。

四、优化器的一些优化手段

1、重新定义关联表的顺序

数据库的关联并不总是按照查询中指定的顺序进行,优化器可能会改变其关联顺序,生成最优的执行计划。

2、将外连接转化为内连接

3、使用增加变换规则

4、优化count()、max()、min()

如果使用min()获取最小值时,可以查询B-Tree索引最左端的记录,MySQL可以直接获取索引的第一行记录。优化器会将这个表达式作为一个常数对待,max()也是如此。如果MySQL使用了这个类型的优化,在explain时就会看到“select tables optimized away”。它表示优化器已经从执行计划中移除了该表,并通过一个常量取而代之。

5、预估并转化为常量表达式

当MySQL检测到一个表达式可以转化为常数的时候,就会一直将该表达式作为常量进行优化处理。

6、覆盖索引扫描

当索引中的列包含所有查询中需要使用的列时,MySQL就可以使用索引返回需要的数据,而无须查询对应的数据行。

7、提前终止查询

可以通过limit主动终止查询。

五、MySQL如何执行关联查询

MySQL对任何关联都执行嵌套循环关联操作,即MySQL先在一个表中循环取出单条数据,然后再嵌套循环到下一个表中寻找匹配的行,依次下去,直到找到所有表中匹配的行为止。然后根据各个表匹配的行,返回查询需要的各个列。

六、查询执行引擎

在解析和优化阶段,MySQL将生成查询对应的执行计划,MySQL的查询执行引擎则根据这个执行计划来完成整个查询。这里的执行计划是一个数据结构,而不是像很多其他数据库那样会生成对应的字节码。

查询执行阶段,只是简单地根据执行计划给出的指令逐步执行。在根据执行计划逐步执行的过程中,有大量的操作需要通过调用存储引擎实现的接口来完成,这些即可被称为“handler API”

MySQL在优化阶段就会为每个表创建一个handler实例,优化器根据这些实例的接口可以获取表的相关信息,包括表的所有列名、索引统计信息等。

七、分页

做法1:假设每页显示10条记录,那么每次查询时用limit返回11条记录,并显示其中的10条,如果第11条存在,那么就显示下一页按钮,否则就说明没有更多的数据。
做法2:现货区并缓存较多的数据,比如先查询1000行,然后每次分页都从这个缓存中获取,如果结果集小于1000,就可以在页面上显示所有的分页链接,因为数据在缓存中,这样做性能不会出现问题。如果结果集大于1000,则可以在页面上加一个查询更多数据的按钮。

这两种方式逗比每次获取全部结果集,再抛弃不需要的数据的方式效率高。



MySQL进阶实战系列文章

MySQL进阶实战 1,数据类型与三范式

MySQL进阶实战 2,那些年学过的事务

MySQL进阶实战 3,mysql索引详解,上篇

MySQL进阶实战4,那些年学过的索引,下篇

MySQL进阶实战5,为什么查询速度会慢

MySQL进阶实战6,缓存表、视图、计数器表

SQL性能优化的21个小技巧

mysql索引详解

MySql基础知识总结(SQL优化篇)

哪吒精品系列文章

Java学习路线总结,搬砖工逆袭Java架构师

10万字208道Java经典面试题总结(附答案)

Java基础教程系列

Spring Boot 进阶实战
在这里插入图片描述

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

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

相关文章

【HTML期末学生大作业】 制作一个简单HTML宠物网页(HTML+CSS)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

Linux 学习笔记 04 —— 文件管理和磁盘管理相关命(2) 详解 grep 命令

用法 less 参数 文件 常用用法 很实用的搜索功能。 向前搜索 / : 使用一个模式进行搜索,并定位到下一个匹配的文本 n : 向前查找下一个匹配的文本 N : 向后查找前一个匹配的文本 向后搜索 ? : 使用模式进行搜…

【C语言】程序环境和预编译

如若这一生注定磨难,自由与真我千金不换 文章目录一、程序的翻译环境和运行环境1.翻译环境(编译(预编译、编译、汇编)链接)2.运行环境(程序入口main 到 程序终止)二、预处理(预编译…

SpringMVC(四)域对象共享数据(干货、超详细)

【环境说明】 SpringMVC项目中使用的是thymeleaf视图解析器 <!-- Spring和thymeleaf的整合--><dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf-spring5</artifactId><version>3.0.12.RELEASE</version>&l…

网络爬虫数据解析的四种方式之XPath

文章目录前言四种数据解析方式数据解析之XPathXPath介绍在浏览器中安装XPath helper插件XPath使用方法通过浏览器测试插件是否安装成功通过python代码实现用XPath来解析数据前言 快期末了&#xff0c;有个数据挖掘的大作业需要用到python的相关知识&#xff08;这太难为我这个以…

C语言基础—数据类型和规范

基本的数据类型和规范 C语言基础—数据类型和规范&#x1f51c; 首先 C 语言所允许的合法符❗ 数据类型和关键字图示❗❗ string 不是C语言关键字&#x1f914; 关于关键字更多的参考⚛ 常量与变量常量定义和分类指数表示法字符常量的转义字符变量定义❗变量(标识符)的命名规范…

『NLP学习笔记』长序列预测论文LTSF-Linear解读

长序列预测论文LTSF-Linear解读 文章目录一. 引言二. 直接多步(DMS)和迭代多步(IMS)的对比三. 基于变压器的Transformer解决方案3.1. 预处理(preprocessing)3.2. 词向量(embedding)3.3. 编码(encoder)3.4. 解码(encoder)四. 一个简单得令人尴尬的Baseline五. 代码解读5.1. 数据…

MySQL字符串索引创建方案

字符串字段添加索引 MySQL是支持前缀索引的&#xff0c;也就是说&#xff0c;你可以定义字符串的一部分作为索引。默认地&#xff0c;如果你创建索引的语句不指定前端长度&#xff0c;那么索引就会包含整个字符串。 # 包含整个字符串 alter table table_name add index index…

liteos连接器脚本隐藏的指针问题

一,数据拷贝引起的指针问题 大家想一下,一个指针指向的内存地址处的数据,假设拷贝到了另外一个地方,那么这个时候我们的指针还是指向原来的位置,那么就会导致问题。为什么提出这个问题呢?因为我们前面讲到了liteos的data段的拷贝,那么对于data段的访问的指针是不是也要…

供应Pyrene-PEG-Biotin,Biotin-PEG-Pyrene,芘丁酸-聚乙二醇-生物素

一&#xff1a;产品描述 1、名称 英文&#xff1a;Pyrene-PEG-Biotin&#xff0c;Biotin-PEG-Pyrene 中文&#xff1a;芘丁酸-乙二醇-生物素 2、CAS编号&#xff1a;N/A 3、所属分类&#xff1a;Biotin PEG Pyrene PEG 4、分子量&#xff1a;可定制&#xff0c;Pyrene-PE…

知识点15--k8s应用入门

本篇我们用上一篇知识点搭建的k8s集群&#xff0c;认识k8s的入门级使用方法&#xff0c;无法完全体现出k8s的性能&#xff0c;注意不是高级的应用。顺便说一点k8s的操作都依靠于命令&#xff0c;甚至是修改配置文件也提供了编辑命令&#xff0c;命令很像js的选择器&#xff0c;…

视频截图修复方法是什么?这些方法和步骤教会你

在日常的生活中&#xff0c;你是否会遇到过这样的情况&#xff1a;每当在观看一些视频的时候&#xff0c;看到自己喜欢的剧情片段时&#xff0c;就会想要将其截取下来留作收藏&#xff0c;但有时候可能会出现截出来的图片画面是模糊的&#xff0c;这该怎么办呢&#xff1f;其实…

MODBUS-TCP协议

modbus-tcp顾名思义是基于TCP网络连接的MODBUS协议。 和RS485总线不同&#xff0c;TCP协议是通过设备的IP地址和端口来寻址。 modbus-tcp的默认端口号是502&#xff0c;设备端作为TCP服务器监听502端口&#xff0c;主机为TCP客户端主动去连接外设。与RS485一样&#xff0c;主机…

LVI-SAM源码解析(一):论文阅读

1. 摘要 LVI-SAM是一种基于平滑化和映射实现的激光雷达-视觉-IMU紧耦合SLAM方法&#xff0c;能够实现高精度、高鲁棒性地实时状态估计和地图构建。 LVI-SAM建立于包含两个子系统的因子图上&#xff1a;视觉-IMU子系统&#xff08;VIS&#xff09;和激光-IMU子系统&#xff…

CMake中target_compile_features的使用

CMake中的target_compile_features命令用向target添加预期的编译器功能(compiler features)&#xff0c;其格式如下&#xff1a; target_compile_features(<target> <PRIVATE|PUBLIC|INTERFACE> <feature> [...]) 指定在编译给定的<target>时所需的编…

SpringBoot+Vue+kkFileView实现文档管理(文档上传、下载、在线预览)

场景 SpringBootVueOpenOffice实现文档管理(文档上传、下载、在线预览)&#xff1a; SpringBootVueOpenOffice实现文档管理(文档上传、下载、在线预览)_霸道流氓气质的博客-CSDN博客_vue openoffice 上面在使用OpenOffice实现doc、excel、ppt等文档的管理和预览。 除此之外…

linux下安装nginx

linux下安装nginx 注&#xff1a;此处需要先安装vmware&#xff0c;下载Centos8等工具&#xff0c;配置好一个虚拟机。 1、下载nginx的linux版本 2、上传至搭建好的linux环境上。 3、解压nginx压缩包 4、安装nginx编译需要的相关 安装 nginx 需要先将官网下载的源码进行编译…

Spring源码深度解析十五:@Aspect方式的AOP中篇 - getAdvicesAndAdvisorsForBean

一、前言 文章目录&#xff1a;Spring源码深度解析&#xff1a;文章目录 在上篇中我们概述了Aop 实现的逻辑&#xff0c;但是由于篇幅原因&#xff0c;我们将一部分内容拆成了中篇和下篇内容。本篇即中篇&#xff0c;内容主要是讲述 在 Bean创建过程中Aop 挑选适用于当前Bean…

html简洁风格的个人博客网站模板(源码)

文章目录1.设计来源1.1 博客首界面1.2 个人简介界面1.3 日常记录界面1.4 文章列表界面1.5 文章信息界面2.结构源码2.1 目录结构2.2 源代码源码下载作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/128288153 html简洁风格…

qtday1:2、重新手动实现对象树模型

代码段加注释 #include <iostream> #include<list> using namespace std; class A { public:list<A *> child; //创建一个链表 public:A(A *parent nullptr){if(parent !nullptr) //说明有父组件{parent->child.push_back(this); //有父组件就将该…