Mysql基础架构以及sql执行原理

1.1 Mysql官方给出的基础架构图

英文版的

mysql执行单个语句是原子的吗_mysql


中文版的

mysql执行单个语句是原子的吗_缓存_02

我用来记录的执行流程图(作图工具ProcessOn)

mysql执行单个语句是原子的吗_java_03

  • Conncetors (连接器) 支持多种协议,多种语言。
    例如 JDBC API, 简单的双层架构连接图,如下:

    可以发现,JDBC的作用在于,它为Java与DBMS之间连接的提供了桥梁。也就是说,java平台或者是客户端平台想要对Mysql数据库进行操作,第一步就必须要与Mysql建立连接。
    已知Mysql底层协议是TCP。那么客户端与Mysql连接时就需要经过"三次握手"。
    举例:
client ---------->发送请求消息------->Mysql     第一次握手
 Mysql受到请求,确认建立连接----------->发送响应---------->client    第二次握手  mysql给予权限
 两次握手就已经可以确立连接关系!第二次握手后,mysql就会给client打开通信
 那么如果client不再发送请求呢?!
 结果只有一个,mysql会一直打开通道,等到client发消息为止,十年,二十年,一百年!
 这期间浪费了多少系统资源?! 所以才需要第三次握手!
 client-------->再次发送消息确认------->Mysql

这就是TCP协议典型的三次握手。
连接分为两种:
短连接:执行少量查询就会断开,浪费资源。
长连接:mysql保持连接状态,但是有默认连接时长, 为 28800秒。

  • Managerment Service
    这里主要是一些工具与系统管理,例如:备份与恢复,分区管理等。
  • Connection Pool(连接池)
    想要明白Pool,就要明白它的出现背景。首先,建立数据库连接与关闭数据库连接都是需要消耗服务器的资源的,那么在一个大项目中,从数据库获取数据再关闭数据库这些操作需要执行上百上千次,这样简直就是在白白浪费系统资源!所以就出现了pool的概念。
    pool的目的在于对已经建立过一次连接的连接进行管理,实现资源重用,提高系统运行速度。
  • Sql Interfaces (接口)
    学习过面向对象编程的就不难理解接口这个概念。在mysql中,sql 接口的目的在于,接受命令,返回结果。
  • Parser (解析器)
    目的在于 对输入的命令进行校验,分析。
    分析方式为两种:
    词法分析:检测每个单词的含义;例如, * 就被解析成表的全部字段
    语法分析:语法规则校验。
  • Optimizer(优化器)
    优化器的目的在于对命令(sql语句)进行优化,选出最优解,提高执行效率。
    索引选择与sql执行顺序都会影响执行效率。
    举例:
    select * from e1 inner join e2 using(id) where e1.c = 10 and e2.d = 20;
    两种执行方式:
    先执行e1.c = 10,查询所有数据,再与e2关联,查出符合e2.d=20 的数据。
    先执行e2.c=20 ,…
    如果e2 与 e1 两张表的数据量差距太大,该怎么选择执行顺序呢?
  • Cache and Buffer
    查询缓存,如果学过Java中的文件操作,就不难理解Buffer与Cache的概念。简单来说,这个东西的出现也是为了提高运行效率,减少消耗。
    在mysql8.0 ,查询缓存已经被mysql官方删除掉了。因为一旦对已经缓存过的数据进行增删改,那么缓存就会失效,得不偿失,所以就给删了。
    8.0之前还是可以用缓存的,但是缓存是默认关闭的。
  • Pluggable Storage Enginers(可插式存储引擎)
    例如ISAM储存引擎,可读取操作的速度快,不占用大量内存与储存资源。
    InnoDB和BDB两种储存引擎包括了对事务处理和外来键的支持,这是他们与其他引擎的最大不同点。我以前一直用的就是InnoDB。
  • File System
    数据储存的地方
  • 执行器
    以Innodb储存引擎为例
    select * from emp where deptno = 10
  1. 验证执行者是否有执行权限;
  2. 调用Innodb储存引擎,开始从第一行查起,depton=10的写入结果集,不等于的跳过。
  3. 将结果返回给client!

当明白这些概念之后,便可看执行流程图了,跟着序号走一走就Ok!