一条SQL查询语句是如何执行的?「终于解决」

一条SQL查询语句是如何执行的?「终于解决」导读 Mysql在中小型企业中是个香饽饽,目前主流的数据库之一,几乎没有一个后端开发者不会使用的,但是作为一个老司机,仅仅会用真的不够。 今天陈某透过一个简单的查询语句来讲述在Mysql内部的执行过程

一条SQL查询语句是如何执行的?

导读

  • Mysql在中小型企业中是个香饽饽,目前主流的数据库之一,几乎没有一个后端开发者不会使用的,但是作为一个老司机,仅仅会用真的不够。

  • 今天陈某透过一个简单的查询语句来讲述在Mysql内部的执行过程。

select * from table where id=10;

代码100分

  

撸它

  • 首先通过一张图片来了解一下Mysql的基础架构,如下:

     

    一条SQL查询语句是如何执行的?「终于解决」

 

  • 从上图可以看出,Mysql大致分为Server层和存储引擎层两部分。

  • Server层包括连接器查询缓存分析器优化器等,其中包含了Mysql的大多数核心功能以及所有的内置函数(如日期,时间函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程触发器视图等。

  • 存储引擎层负责数据的存储和提取。它的架构是可插拔式的,支持InnoDBMyISAM等多个存储引擎。Mysql中主流的存储引擎是InnoDB,由于它对事务的支持让它从Mysql5.5.5版本开始成为了默认的存储引擎。

  • 大致了解了整体架构,现在说说每一个基础的模块都承担着怎样的责任。

 

1. 连接器

  • 顾名思义,是客户端和Mysql之间连接的媒介,负责登录、获取权限、维持连接和管理连接。连接命令一般如下:

代码100分mysql [-h] ip [- P] port -u [user] -p 
  • 在完成经典的TCP握手后,连接器会开始认证身份,要求输入密码。

    • 密码认证通过,连接器会查询出拥有的权限,即使管理员修改了权限,也不会影响你这次的连接,只有重新连接才会生效。

    • 密码认证失败,会收到提示信息Access denied for user

  • 连接完成后,没有后续动作的连接将会变成空闲连接,你可以输入show processlist命令看到它。如下图,其中的Command这一列显示为sleep的这一行表示在系统里面有一个空闲连接。

     

    一条SQL查询语句是如何执行的?「终于解决」

     

  • 客户端如果太长时间没有执行动作,连接器将会自动断开,这个时间由参数wait_timeout控制,默认值是8小时。

  • 如果在连接被断开之后,客户端再次发送请求的话,就会收到一个错误提醒: Lost connection to MySQL server during query。这时候如果你要继续,就需要重连,然后再执行请求了。

 

 

2. 查询缓存【废材,8.0 版本完全删除】

  • 连接建立完成后,你就可以select语句了,执行之前会查询缓存。

  • 查询缓存在Mysql中的是默认关闭的,因为缓存命中率非常低,只要有对表执行一个更新操作,这个表的所有查询缓存都将被清空。怎么样?一句废材足以形容了!!!

  • 废材的东西不必多讲,主流的Redis的缓存你不用,别再搞这废材了。

 

3. 分析器

  • 如果没有命中查询缓存,就要执行查询了,但是在执行查询之前,需要对SQL语句做解析,判断你这条语句有没有语法错误。

  • 分析器会做 “词法分析” ,你输入的无非可就是多个字符串和空格组成的SQL语句,MYSQL需要识别出里面的字符串是什么,代表什么,有没有关键词等。

  • MYSQL会从你输入的select 这个关键字识别出来是一个查询语句,table是表名,id是列名。

  • 做完这些会做 “语法分析” ,根据MYSQL定义的规则来判断你的SQL语句有没有语法错误,如果你的语法不对,就会收到类似如下的提醒:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near "elect * from t where ID=1" at line 1
  • 一般语法错误会提示第一个出现错误的位置,所以你要关注的是紧接“use near”的内容。

 

4. 优化器

  • 经过分析器词法和语法的分析,此时就能知道这条SQL语句是干什么的。但是在开始执行之前,MYSQL底层还要使用优化器对这条SQL语句进行优化处理。

  • MYSQL内部会对这条SQL进行评估,比如涉及到多个索引会比较使用哪个索引代价更小、多表join的时候会考虑决定各个表的连接顺序。

  • 优化器的作用一句话总结:根据MYSQL内部的算法决定如何执行这条SQL语句来达到MYSQL认为代价最小目的。

  • 优化器阶段完成后,这个语句的执行方案就确定了,接下来就交给执行器执行了。

 

5. 执行器

  • MYSQL通过分析器知道了要做什么,通过优化器知道了如何做,于是就进入了执行器阶段。

  • 执行器开始执行之前,需要检查一下用户对表table有没有执行的权限,没有返回权限不足的错误,有的话就执行。

  • 执行也是分类的,如果Id不是索引则全表扫描,一行一行的查找,如果是索引则在索引组织表中查询,索引的查询很复杂,其中涉及到B+树等算法,这里不再详细介绍。

 

总结

  • 一条SQL语句在MYSQL内部执行的过程涉及到的内部模块有:连接器、查询缓存、分析器、优化器、执行器、存储引擎。

  • 至此,MYSQL的基础架构已经讲完了。如果觉得作者讲的好,有所收获的话,关注下作者的公众号【码猿技术专栏】,每天有精彩文章推送!!!一条SQL查询语句是如何执行的?「终于解决」

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/9321.html

(0)
上一篇 2023-02-11 09:00
下一篇 2023-02-11

相关推荐

  • 并发控制的概念_并发控制概念

    并发控制的概念_并发控制概念11章 并发数据 了解并发需要先了解的概念: 1.数据库是一个可以共享资源,可以多用户同时使用一个数据库,该数据库称为多用户数据库,如订票系统、银行系统 2.多事务执行方式: 1.事务串行执行 : 务

    2023-06-18
    140
  • oracle日期处理函数整理「建议收藏」

    oracle日期处理函数整理「建议收藏」1.trunc 函数 截断函数既可以截取日期 也可以截取数字 返回今天的日期 select trunc(sysdate) from dual; –07-6月 -20 返回当月第一天 select t

    2023-03-08
    149
  • MYSQL建表规则

    MYSQL建表规则建立表规约 【强制】表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只 出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。 说明:MySQL…

    2023-03-08
    167
  • 数据库-三范式优化与不推荐使用外键[通俗易懂]

    数据库-三范式优化与不推荐使用外键[通俗易懂]反三范式其实是基于三范式所调整的,没有冗余的数据库未必是最好的数据库,完全按照第三范式做表的设计可能会降低查询效率(涉及多表查询,多表连接JOIN,临时表创建GROUP BY),有时候为了提高运行效率

    2023-04-13
    160
  • 关于python发送邮件测试报告的信息

    关于python发送邮件测试报告的信息一般最好有个smtp服务器,比如说你在163注册个邮箱,这样可以用smtplib通过这个邮箱来发送。以下是示例:

    2023-12-01
    110
  • metadata怎么打开_查看过分享是什么意思

    metadata怎么打开_查看过分享是什么意思作者:洪斌 爱可生南区负责人兼技术服务总监,MySQL ACE,擅长数据库架构规划、故障诊断、性能优化分析,实践经验丰富,帮助各行业客户解决 MySQL 技术问题,为金融、运营商、互联网等行业客户提…

    2023-03-13
    162
  • Anaconda使用教程

    Anaconda使用教程Anaconda是一个开源的Python发行版,可以在Windows、Linux和MacOS等多种操作系统中使用。Anaconda内置了大量科学计算和数据处理相关的库和工具,使得Python的使用更加简单和高效。

    2024-09-15
    26
  • 包含python练习实例019的词条

    包含python练习实例019的词条1、 串联比较

    2023-11-29
    114

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注