MySQL(一):整体逻辑架构

文章目录

    • 1、MySQL整体逻辑架构
    • 2、MySQL逻辑架构组件
      • 2.1、Connectors(连接器组件)
      • 2.2、Management Serveices & Utilities(服务管理和工具组件)
      • 2.3、Connection Pool(连接池组件)
      • 2.4、SQL Interface(SQL接口组件)
      • 2.5、Parser(查询解析器组件)
      • 2.6、Optimizer(查询优化器组件)
      • 2.7、Cache & Buffer(缓存组件)
      • 2.8、可插拔存储引擎
    • 3、MySQL常用存储引擎
      • 3.1、InnoDB引擎:
      • 3.2、MyISAM引擎:
    • 4、参考文献

很多开发及测试人员都知道如何编写SQL查询以及如何从表中获取数据。 但是只有少数人了解内部架构以及MySQL如何与存储引擎交互。 该系列将讨论MySQL体系结构,MySQL数据中SQL语句的不同层次和执行流程。

本文为系列开篇旨在从整体对MySQL数据库进行一个认识,随后的系列文章会深入其各个方面进行原理解析,进一步加深对MySQL的认知、提升自己对MySQL的运用、运维及优化能力。

1、MySQL整体逻辑架构

MySQL逻辑架构整体分为三层:

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

MySQL(一):整体逻辑架构_第1张图片

2、MySQL逻辑架构组件

MySQL(一):整体逻辑架构_第2张图片

从图中我们可以看到,MySQL逻辑架构由以下组件组成:

2.1、Connectors(连接器组件)

MySQL连接器为客户端程序提供与MySQL服务器的连接。 连接器使您能够连接和执行来自另一种语言或环境的MySQL语句,包括ODBC,Java(JDBC),Perl,Python,PHP,Ruby和本机C MySQL实例。

Oracle开发了很多连接器:

1、Connector / C ++ 使C ++应用程序可以连接到MySQL。

2、Connector / J 提供驱动程序支持,可使用标准Java数据库连接(JDBC)API从Java应用程序连接到MySQL。

3、Connector/NET 使开发人员可以创建连接到MySQL的.NET应用程序。 Connector/NET 实现了功能齐全的ADO.NET接口,并提供了与ADO.NET感知工具一起使用的支持。 可以支持任何.NET语言编写的应用程序连接MySQL数据库。

适用于Visual Studio的MySQL可与Connector / NET和Microsoft Visual Studio 2012、2013、2015和2017配合使用。适用于Visual Studio的MySQL提供对来自Visual Studio的MySQL对象和数据的访问。 作为Visual Studio程序包,它直接集成到Server Explorer中,从而能够创建新连接并使用MySQL数据库对象。

4、Connector/ODBC 为使用开放数据库连接(ODBC)API连接到MySQL提供驱动程序支持。 支持从Windows,Unix和macOS平台进行ODBC连接。

5、Connector/Python 提供了对Python语言驱动程序支持,可使用兼容 Python DB API版本2.0的API从Python应用程序连接到MySQL。不需要其他Python模块或MySQL客户端库。

2.2、Management Serveices & Utilities(服务管理和工具组件)

系统管理和控制工具,比如MySQL安装包bin目录下提供的服务管理和工具(mysqld、mysql_safe、mysql.server等)。

2.3、Connection Pool(连接池组件)

连接池是一种创建和管理可供任何需要它们的线程使用的连接池的技术。 连接池可以大大提高Java应用程序的性能,同时减少总体资源使用量。

负责监听对 MySQL Server 的各种请求,接收连接请求,转发所有连接请求到线程管理模块。每一个连接上 MySQL Server 的客户端请求都会被分配(或创建)一个连接线程为其单独服务。而连接线程的主要工作就是负责 MySQL Server 与客户端的通信,接受客户端的命令请求,传递 Server 端的结果信息等。线程管理模块则负责管理维护这些连接线程。包括线程的创建,线程的 cache 等。

2.4、SQL Interface(SQL接口组件)

接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface

2.5、Parser(查询解析器组件)

与许多其他解析器一样,MySQL的解析器由两部分组成:词法扫描器和语法规则模块。词法扫描器将整个查询分解为标记(不可分割的元素,例如列名),而语法规则模块查找产生此序列的SQL语法规则的组合,并执行与这些规则关联的代码。最后,生成了一个分析树,优化器则可以基于它进行优化工作。

SQL命令传递到解析器的时候会被解析器验证和解析。MySQL Parser(解析器) 是利用C/C++实现的开源yacc/lex组合,也就是 GNU bison/flex。Flex负责生成tokens, Bison负责语法解析。

在 MySQL中我们习惯将所有 Client 端发送给 Server 端的命令都称为 query ,在 MySQL Server 里面,连接线程接收到客户端的一个 Query 后,会直接将该 query 传递给专门负责将各种 Query 进行分类然后转发给各个对应的处理模块。

查询解析器组件主要功能:

  • 将SQL语句进行语义和语法的分析,分解成数据结构,然后按照不同的操作类型进行分类,然后针对性的转发到后续步骤,后续SQL语句的传递和处理就是基于这个结构的。
  • 如果在解析过程中遇到错误,那么就说明这个sql语句是不合理的

2.6、Optimizer(查询优化器组件)

SQL语句在查询之前会使用查询优化器对查询进行优化。就是优化客户端请求的 query(sql语句) ,根据客户端请求的 query 语句,和数据库中的一些统计信息,在一系列算法的基础上进行分析,得出一个最优的策略.

SELECT * FROM tbl_name WHERE 0;

在这种情况下,MySQL查看WHERE子句,意识到没有行可能满足查询,就不会再去搜索表。 您可以通过发出EXPLAIN语句来查看此信息,该语句告诉MySQL显示一些有关如何在不实际执行SELECT查询的情况下执行SELECT查询的信息。

EXPLAIN SELECT * FROM tbl_name WHERE 0
   id  select_type  table   partitions  type    possible_keys  key     key_len  ref       rows  filtered  Extra             
------  -----------  ------  ----------  ------  -------------  ------  -------  ------  ------  --------  ------------------
     1  SIMPLE       (NULL)  (NULL)      (NULL)  (NULL)         (NULL)  (NULL)   (NULL)  (NULL)    (NULL)  Impossible WHERE  

2.7、Cache & Buffer(缓存组件)

MySQL使用多种策略将信息缓存在内存缓冲区中以提高性能。根据您的数据库体系结构,您可以平衡这些区域的大小和布局,以在不浪费内存或不超过可用内存的情况下提供最大的性能优势。

他的主要功能是将客户端提交 给MySQL 的 Select 类 query 请求的返回结果集 cache 到内存中,与该 query 的一个 hash 值 做
一个对应。该 Query 所取数据的基表发生任何数据的变化之后, MySQL 会自动使该 query 的Cache 失效。在读写比例非常高的应用系统中, Query Cache 对性能的提高是非常显著的。当然它对内存的消耗也是非常大的。

如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等

2.8、可插拔存储引擎

存储引擎接口模块可以说是 MySQL 数据库中最有特色的一点了。目前各种数据库产品中,基本上只有 MySQL 可以实现其底层数据存储引擎的插件式管理。这个模块实际上只是 一个抽象类,但正是因为它成功地将各种数据处理高度抽象化,才成就了今天 MySQL 可插拔存储引擎的特色。

从图可以看出,MySQL区别于其他数据库的最重要的特点就是其插件式的表存储引擎。MySQL插件式的存储引擎架构提供了一系列标准的管理和服务支持,这些标准与存储引擎本身无关,可能是每个数据库系统本身都必需的,如SQL分析器和优化器等,而存储引擎是底层物理结构的实现,每个存储引擎开发者都可以按照自己的意愿来进行开发。

注意:存储引擎是基于表的,而不是数据库。

3、MySQL常用存储引擎

这里主要介绍InnoDB引擎和MyISAM引擎,其它引擎后文会单独介绍

3.1、InnoDB引擎:

  • 将数据存储在表空间中,表空间由一系列的数据文件组成,由InnoDB管理;
  • 支持每个表的数据和索引存放在单独文件中(innodb_file_per_table);
  • 支持事务,采用MVCC来控制并发,并实现标准的4个事务隔离级别,支持外键;
  • 索引基于聚簇索引建立,对于主键查询有较高性能;
  • 数据文件的平台无关性,支持数据在不同的架构平台移植;
  • 能够通过一些工具支持真正的热备。如XtraBackup等;
  • 内部进行自身优化如采取可预测性预读,能够自动在内存中创建hash索引等。

3.2、MyISAM引擎:

  • 不支持事务和行级锁;
  • 提供大量特性如全文索引、空间函数、压缩、延迟更新等;
  • 数据库故障后,安全恢复性差;
  • 对于只读数据可以忍受故障恢复,MyISAM依然非常适用;
  • 日志服务器的场景也比较适用,只需插入和数据读取操作;
  • 不支持单表一个文件,会将所有的数据和索引内容分别存在两个文件中;
  • MyISAM对整张表加锁而不是对行,所以不适用写操作比较多的场景;
  • 支持索引缓存不支持数据缓存。

4、参考文献

  1. 《高性能MySQL(第3版)》
  2. 《MySQL技术内幕:InnoDB存储引擎(第2版)》
  3. 《MySQL源码库》
  4. 《MySQL参考手册》
  5. 《MySQL实战45讲》
  6. 《MySQL 是怎样运行的:从根儿上理解 MySQL》

你可能感兴趣的:(【数据库】MySQL)