专栏首页码猿技术专栏一条查询语句到底是如何执行的?

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

文章目录

  1. 1. 导读
  2. 2. 撸它
    1. 2.1. 1. 连接器
    2. 2.2. 2. 查询缓存【废材,8.0 版本完全删除】
    3. 2.3. 3. 分析器
    4. 2.4. 4. 优化器
    5. 2.5. 5. 执行器
  3. 3. 总结

导读

  • Mysql在中小型企业中是个香饽饽,目前主流的数据库之一,几乎没有一个后端开发者不会使用的,但是作为一个老司机,仅仅会用真的不够。
  • 今天陈某透过一个简单的查询语句来讲述在Mysql内部的执行过程。 select * from table where id=10;

撸它

  • 首先通过一张图片来了解一下Mysql的基础架构,如下:
  • 从上图可以看出,Mysql大致分为Server层和存储引擎层两部分。
  • Server层包括连接器、查询缓存、分析器、优化器等,其中包含了Mysql的大多数核心功能以及所有的内置函数(如日期,时间函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
  • 存储引擎层负责数据的存储和提取。它的架构是可插拔式的,支持InnoDB、MyISAM等多个存储引擎。Mysql中主流的存储引擎是InnoDB,由于它对事务的支持让它从Mysql5.5.5版本开始成为了默认的存储引擎。
  • 大致了解了整体架构,现在说说每一个基础的模块都承担着怎样的责任。

1. 连接器

  • 顾名思义,是客户端和Mysql之间连接的媒介,负责登录、获取权限、维持连接和管理连接。连接命令一般如下: mysql [-h] ip [- P] port -u [user] -p
  • 在完成经典的TCP握手后,连接器会开始认证身份,要求输入密码。
    • 密码认证通过,连接器会查询出拥有的权限,即使管理员修改了权限,也不会影响你这次的连接,只有重新连接才会生效。
    • 密码认证失败,会收到提示信息Access denied for user。
  • 连接完成后,没有后续动作的连接将会变成空闲连接,你可以输入show processlist命令看到它。如下图,其中的Command这一列显示为sleep的这一行表示在系统里面有一个空闲连接。
  • 客户端如果太长时间没有执行动作,连接器将会自动断开,这个时间由参数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的基础架构已经讲完了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

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

    我们只看到一个输入语句,返回一个结果,却不知道这个 SQL 语句在 MySQL 内部的执行过程。

    王小明_HIT
  • 一条sql查询语句是如何执行的

    作为一名常年CURD的程序员,一定非常熟悉这条查询语句吧。从jiuxiao_admin_log 表中查询 user_id=1000的数据。 然而我们只知道这样会...

    九霄道长
  • 一条SQL查询语句是如何执行的?

    首先有一个 user_info 表,表里有一个 id 字段,执行下面这条查询语句:

    武培轩
  • MySQL实战 -- 一条SQL查询语句是如何执行的?

    来跟你聊聊 MySQL 的基础架构。我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题。同样,对于 MySQL 的...

    MachineLP
  • 一文读懂一条 SQL 查询语句是如何执行的

    2001 年 MySQL 发布 3.23 版本,自此便开始获得广泛应用,随着不断地升级迭代,至今 MySQL 已经走过了 20 个年头。

    飞天小牛肉
  • Mysql进阶篇--一条sql查询语句如何执行

    日常中,我们只看到返回一条或多条结果,并没有过多的去关注查询语句具体要执行那些流程,今天我们看看他的执行流程,我们先整体的看一下他的流程图,如下

    小土豆Yuki
  • 深入理解SQL原理:一条SQL查询语句是如何执行的?

    首先有一个 user_info 表,表里有一个 id 字段,执行下面这条查询语句:

    Java_老男孩
  • 一条更新语句是如何执行的?

    之前你可能经常听DBA同事说,MySQL可以恢复到半个月内任意一秒的状态,惊叹的同时,你是不是心中也会不免会好奇,这是怎样做到的呢?

    王小明_HIT
  • Mysql - 一条sql语句是如何执行的

    每次查询都会缓存查询结果,相同语句再次查询时直接返回缓存结果,缓存结果会在修改表信息时自动失效。

    夹胡碰
  • MySQL中一条SQL语句是如何执行的?

    client 首先要与 MySQL 建立连接,这就需要一个连接器,负责与 client 建立连接、权限验证、管理连接。

    dys
  • 一条sql语句究竟是如何执行的

    相信做后端的同学肯定离不开一个话题,就是 mysql,大家也花式的执行过各种各样的 sql 语句,然后得到返回结果,那么一条 sql 语句执行究竟经历了哪些步骤...

    程序员小饭
  • 如何查询postgresql 执行过的sql语句[未试验]

    SELECT  procpid,  start,  now() - start AS lap,  current_query  FROM  (SEL...

    双面人
  • 一条SQL语句在MySQL中是如何执行的

    本篇文章会分析下一个sql语句在mysql中的执行流程,包括sql的查询在mysql内部会怎么流转,sql语句的更新是怎么完成的。

    Java团长
  • 一条更新语句如何执行

    其实更新语句和查询语句的流程是基本一样的,但是他其中不一样的是涉及两个日志模块,也就是我们经常提到的redo log(重做日志)和binlog(归档日志)。

    小土豆Yuki
  • 详解一条查询select语句和更新update语句的执行流程

    前面几篇MySQL系列的文章介绍了索引,事务和锁相关知识,那么今天就让我们来看看当我们执行一条select语句和一条update语句的时候,MySQL要经过哪些...

    用户2781897
  • MySQL实战 -- 一条SQL更新语句是如何执行的?

    前面我们系统了解了一个查询语句的执行流程,并介绍了执行过程中涉及的处理模块。相信你还记得,一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模...

    MachineLP
  • 一条SQL语句在MySQL中如何执行的

    本篇文章会分析一个 sql 语句在 MySQL 中的执行流程,包括 sql 的查询在 MySQL 内部会怎么流转,sql 语句的更新是怎么完成的。

    帅地
  • 深入学习MySQL 01 一条查询语句的执行过程

    在学习SpringCloud的同时,也在深入学习MySq中,听着,看着<高性能MySQL本系列文章是本人学习过程的总结,水平有限,仅供参考,若有不对之处或有啥...

    KEN DO EVERTHING
  • laravel实现查询最后执行的一条sql语句的方法

    其中query所对应的为执行的SQL语句,?则表示参数值,即bindings中的值!

    砸漏

扫码关注云+社区

领取腾讯云代金券