一:概述

  - 首先需要认识一下 Mysql 整体的基础架构

  - 

二:Mysql 的分层

  - MySQL 可以分为 Server 层和存储引擎层两部分

  - Server 层

    - Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能。

    - 以及所有的内置函数(如日期、时间、数学和加密函数等)

    - 所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。

  - 存储引擎层

    - 而存储引擎层负责数据的存储和提取。

    - 其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。

    - 现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。

三:执行流程

  - 1:连接器

    - 当在 Shell 中连接 Mysql 服务(mysql -h$ip -P$port -u$user -p)在完成 TCP 握手连接之后,连接器即开始身份认证

      - 如果用户名或密码不对,你就会收到一个"Access denied for user"的错误,然后客户端程序结束执行。

      - 如果用户名密码认证通过,连接器会到权限表里面查出你拥有的权限。

      - 之后,这个连接里面的权限判断逻辑,都将依赖于连接时读到的权限。

      - PS

        - 根据这里的身份认证可以知道,权限的认证,是在连接 Mysql 时完成的。

        - 所以,即使管理员在连接状态时修改了权限,也不会影响已经存在的连接。之后的链接才会使用新的权限状态。

    

    - 每个连接的链接状态

      - show processlist;

    

    - 客户端如果太长时间没动静,连接器就会自动将它断开。

      - 这个时间是由参数 wait_timeout 控制的,默认值是 8 小时。

      - 如果在连接被断开之后,客户端再次发送请求的话,就会收到一个错误提醒: Lost connection to MySQL server during query。

      - 这时候如果你要继续,就需要重连,然后再执行请求了。

    - 长链接/短连接

      - 数据库里面,长连接是指连接成功后,如果客户端持续有请求,则一直使用同一个连接。

      - 短连接则是指每次执行完很少的几次查询就断开连接,下次查询再重新建立一个。

      - PS:

        - 长链接过多会导致 Mysql 的内存使用快速增长。

          - 这是因为 MySQL 在执行过程中临时使用的内存是管理在连接对象里面的。

          - 这些资源会在连接断开的时候才释放。

          - 所以如果长连接累积下来,可能导致内存占用太大,被系统强行杀掉(OOM),从现象看就是 MySQL 异常重启了。

        - 解决

          - 定期断开长连接并重启。

          - 如果你用的是 MySQL 5.7 或更新版本,可以在每次执行一个比较大的操作后,通过执行 mysql_reset_connection 来重新初始化连接资源。

  - 2:查询缓存

    - MySQL 拿到一个查询请求后,会先到查询缓存查询

    - 如果你的查询能够直接在这个缓存中找到 key,那么这个 value 就会被直接返回给客户端。

    - 但是大多数情况下我会建议你不要使用查询缓存,为什么呢?因为查询缓存往往弊大于利。

      - 查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。

      - 因此很可能你费劲地把结果存起来,还没使用呢,就被一个更新全清空了。

      - 对于更新压力大的数据库来说,查询缓存的命中率会非常低。

      - 除非你的业务就是有一张静态表,很长时间才会更新一次。

      - 比如,一个系统配置表,那这张表上的查询才适合使用查询缓存。

      - 在 MySQL 8.0 中,缓存功能彻底被废弃。

  

  - 3:分析器

    - 解析SQL 语句

    - 分析整个的 SQL 动作

 
  - 4:优化器
    - 选择查找记录的最优方案
 
  
  - 5:执行器
    - 调用存储引擎执行
 

《Mysql 一条 SQL 语句是如何执行的?》的更多相关文章

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. 配置interfaces

    demo1 # This file describes the network interfaces available on your system # and how to activate th ...

  2. python3编程基础之一:操作

    基本操作有:读数据.写数据.运算.控制.输入.输出.语句块 1.读取数据: num1 = 50 num2 = num1 //通过num2取得num1的值,这就是逻辑上的读取 测试数据:print(nu ...

  3. Dp优化之决策单调栈优化

    证明:g(i) ≤ g(j)   (i ≤ j) 令 d=g(i) , k<d , 设cut = x表示 f(i) = f(x) + w[x,i]    ( x < i ) 构造一个式子: ...

  4. fluent中如何对一个非整个volume的特定的区域进行数据分析?【转载】

    作者:王蒙 链接:https://www.zhihu.com/question/37432813 来源:知乎 很抱歉,我不知道 fluent 中是否有这一功能,我这个学期才开始学.但 CFD-Post ...

  5. 解析复杂的嵌套数据结构-jsonpath

    JsonPath是一种简单的方法来提取给定JSON文档的部分内容. JsonPath有许多编程语言,如Javascript,Python和PHP,Java. JsonPath提供的json解析非常强大 ...

  6. final和finally的区别

    final关键字可以用于修饰类,方法,变量.用该关键字修饰类,方法,变量都有不可变的特性. 1)final关键字用于基本数据类型前,就表明该变量就变成了一个常量,在被定义后的赋值不能被修改. 2)fi ...

  7. oracle之按表名查询表字段结构

    工作中查看oracle表结构, 1,pl/sql或其他开发工具可以输入表名然后ctr+点击表名就可以看见表结构: 2,表字段过多,如果给第三方截图看比较麻烦,得截好几次,容易看眼花,可以查询如下sql ...

  8. <JavaScript>调用apply报错:CreateListFromArrayLike called on non-object;

    Function.apply(obj, args)方法能接收两个参数 obj:这个对象将代替Function类里this对象 args:这个是数组,它将作为参数传给Function(args--> ...

  9. Ionic4.x 中的 UI 组件(UI Components) Slides 轮播图组件、Searchbar 组件、 Segment 组件

    Slides 轮播图组件 Ionic4.x 中的轮播图组件是基于 swiper 插件,所以配置 slides 的属性需要在 swiper 的 api 中 找 Swiper Api:http://ida ...

  10. 005-tomcat日志体系

    一.概述 首先了解java的日志体系 在JDK1.4后,sun公司增加了一个包为java.util.logging,简称为jul,用以对抗log4j. 后续还有很多日志门面方案,但是tomcat使用了 ...