mysql系统学习1- mysql的大体结构及执行流程

mysql结构介绍

简化版mysql结构图:    

mysql系统学习1 - mysql的大体结构及执行流程

mysql逻辑架构整体分为三层:
1. 客户端 : 并非MySQL所独有,诸如 : 连接处理、授权认证、安全等功能均在这一层处理
2. 核心服务 : 包括查询解析、分析、优化、缓存、内置函数(比如 : 时间、数学、加密等函数),所有的跨存储引擎的功能也在这一层实现 : 存储过程、触发器、视图等 
3. 存储引擎 : 负责 MySQL 中的数据存储和提取,和 Linux 下的文件系统类似,每种存储引擎都 有其优势和劣势,中间的服务层通过 API 与存储引擎通信,这些 API接口 屏蔽不同存储引擎间的 差异

mysql官网的详解图:
mysql系统学习1 - mysql的大体结构及执行流程

mysql执行流程:

  • 客户端
  • mysql连接层:
    1. 对账号密码的校验
    2. 分配线程
    3. 对用户操作数据库表权限的校验
    4. 返回连接的id (以上任何一步出错抛出异常)
      show variables like “%max_connections%” 最大连接数查询
      show processlist 查看当前已连接的用户列表
  • sql层
    1. sql语句api 接收到由连接层传递过来的sql语句. 判断sql语句的类型 (mysql8.0之前会先判断查询缓存器是否开启,开启并且命中缓存,则会直接返回结果)
      例: select * from users where id > 10 and (age > 25 or sex = 0);
    2. sql解析器: (8.0解析器: sql解析器; 语法解析器)
      根据查询的sql语句将sql划分为小token;
      select, *, from, users, where, id, >, 10, and, (,age, >, 25, or, sex, =, 0,)
      得到上面分解的token进行排列组合成解析树.(依据where条件中的关键字来进行组合)如下图:
      mysql系统学习1 - mysql的大体结构及执行流程
    3. sql优化器:
      • 获取查询表的信息(如字段信息, 字段类型, 存储位置, 索引等),如果有join则获取多张表信息
      • 根据解析树进行条件过滤(主要是排除一些无意义查询 1=1)
      • 根据索引信息确定执行计划
      • 执行计划

        sql语句四大分类:

        ddl: 数据定义语言(Data Definition Language) create,drop,alter (主要为以上操作 即对逻辑结构等有操作的,其中包括表结构,视图和索引)
        dql : 数据查询语言(Data Query Language) select 查询操作
        dml : 数据操纵语言(Data Manipulation Language) insert, update, delete 对数据进行操作的
        dcl : 数据控制功能(Data Control Language) grant, revoke, commit, rollback 对数据库安全性完整性等有操作的
  • 存储引擎层
    • Innodb存储引擎

      Innodb存储引擎支持事务,其设计目标主要面向在线事务处理的应用,其特点是行锁设计,支持外键,并支持类似于Oracle的非锁定读,即默认读取操作不会产生锁,从mysql数据库5.5版本开始,Innodb存储引擎是默认的存储引擎。Innodb存储引擎支持事务,其设计目标主要面向在线事务处理的应用,其特点是行锁设计,支持外键,并支持类似于Oracle的非锁定读,即默认读取操作不会产生锁,从mysql数据库5.5版本开始,Innodb存储引擎是默认的存储引擎。

    • myisam存储引擎

      myisam存储引擎不支持事务。支持全文索引,主要面向一些OLAP数据应用,mysql5.5版本之前myisam存储引擎是默认的存储引擎,数据库系统与文件系统很大的一个不同之处在于对事务的支持,然而myisam存储引擎是不支持事务的,这个也不是很难理解,试想一下用户是否在所有的应用中都需要事务呢?在数据仓库中,如果没有ETL这些操作,只是简单的报表查询是否还需要事务的支持呢?此外,Myisam存储引擎的另一个与众不同的地方是它的缓冲池只缓存索引文件,而不是缓冲数据文件,这一点和大多数的数据库都非常不同。Myisam存储引擎表由MYD和MYI组成,MYD用来存放数据文件,MYI用来存放索引文件,可以通过使用myisampack工具进一步压缩数据文件,因为myisampack工具使用赫夫曼编码静态算法来压缩数据,因此使用myisampack工具压缩后的表是只读的,也可以通过myisampack来解压数据文件在mysql5.0版本之前,myisam默认支持表大小为4GB,如果需要支持大于4GB的myisam表时,则需要指定MAX_WORS和AVG_ROW_LENGTH属性,从mysql5.0版本开始,myisam默认支持256GB的表数据,这足够满足一般的需求myisam存储引擎是默认的存储引擎,数据库系统与文件系统很大的一个不同之处在于对事务的支持,然而myisam存储引擎是不支持事务的,这个也不是很难理解,试想一下用户是否在所有的应用中都需要事务呢?在数据仓库中,如果没有ETL这些操作,只是简单的报表查询是否还需要事务的支持呢?此外,Myisam存储引擎的另一个与众不同的地方是它的缓冲池只缓存索引文件,而不是缓冲数据文件,这一点和大多数的数据库都非常不同。Myisam存储引擎表由MYD和MYI组成,MYD用来存放数据文件,MYI用来存放索引文件,可以通过使用myisampack工具进一步压缩数据文件,因为myisampack工具使用赫夫曼编码静态算法来压缩数据,因此使用myisampack工具压缩后的表是只读的,也可以通过myisampack来解压数据文件在mysql5.0版本之前,myisam默认支持表大小为4GB,如果需要支持大于4GB的myisam表时,则需要指定MAX_WORS和AVG_ROW_LENGTH属性,从mysql5.0版本开始,myisam默认支持256GB的表数据,这足够满足一般的需求

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!