[回顾MySQL]体系结构-静态组成


本章节主要回顾MySQL数据库的系统结构,梳理MySQL服务器各个组成部分及其功能。

数据库与数据库实例

在介绍MySQL的体系结构之前,首先区分一个容易混淆的概念–数据库与数据库实例。大多数情况我们并不强调两者的差别,但作为MySQL与Oracle/SQL Server在结构上的重要区别还是有必要了解的。

从概念上说数据库是一组按照某种数据模型组织起来的、保存于二级存储中的文件集合;而数据库实例指的是数据库管理程序。对于Oracle来说一个数据库运行于一个数据库实例之中,而MySQL支持单实例多数据库,也就是说我们可以启动一个MySQL程序而在上面创建并运行多个数据库。后续我们将不再强调区分数据库与数据库实例。

MySQL的静态体系结构

img

上图来自MySQL官方手册,可以看到MySQL数据库主要由一下几部分组件构成。

连接池组件

主要负责监听发送到MySQL连接请求,对连接进行认证鉴权,然后将请求转发到连接线程、连接线程将负责Server与Client的通信,连接池组件负责管理这些连接线程及线程池,进行线程的创建、销毁、复用以及线程Cache、内存的管理。

管理服务及工具组件

负责着服务器的管理、配置、元数据、备份、恢复、安全功能,复制、集群功能也在这部分实现。

SQL接口

负责处理SQL功能,包括DML、DDL、存储过程、视图、触发器等。SQL语句的含义被转换为对数据库的操作,其中查询语句包含了我们绝多数对数据库的需求,这些查询将被送到查询解析器进行处理,最终生成执行计划,执行并返回我们所需的数据。

查询分析器组件

查询分析器解析SQL查询语句生成MySQL内部的对象,这个过程就是查询翻译的过程;同时在这个过程还有对象权限的校验工作。这部分基本就是一个编译器做的工作,一般基础流程为词法分析、语法分析、最终生成抽象语法树(AST)。词法分析器和语法分析器可以HardCode,但为了简洁可靠人们更多的使用一些已有的组件技术,其中Flex和Bison的组合是最著名的。Flex负责进行词法解析、Bison进行语法分析。但是MySQL为了保证灵活和性能,没有采用Flex而是自己实现了一个分析器;然后用Bison进行语法分析生成MySQL内部的Item对象构成AST。有一本关于flex/bison的书实例演示了一个SQL词法、语法解析器。作为一个程序人员对这一块理解并不深入,因为它就是负责一个翻译工作,只要保证翻译高效正确即可,而且这个翻译过程非常繁琐、非常艰涩。对于这部分我感觉作为程序人员除了规范SQL格式,尽可能利用查询分析器可能存在的缓存减少、简化翻译过程没有太多可控性。可能DBA或者SQL Proxy会对这一块进行研读,比如360 Atlas开发人员。

优化器组件

同一个Query可以按照A路径执行也可以按照B路径执行,不同的执行路径会有不同的执行效率。同时请求到达存储引擎以后使用哪个索引这都严重影响执行的效率。访问路径和索引的选择要依赖对数据的统计所以这部分包含对数据库中的数据情况统计。这一部分是程序人员最需要的关注的,深入理解这部分将能为编写高效程序提供有力的保障。

缓冲组件

缓存是提升效率的一个核心手段,MySQL这个层面的缓存包括全局和引擎级别的缓存的管理。对这一块进行学习理解、尽可能的提高缓存的命中率,将能大大提升系统的性能。

插件式存储引擎

MySQL采用插件式存储引擎是其核心特点之一。不同存储引擎的选择将从根本上影响系统的特性和性能,对比了解各个存储引擎的特性和性能对系统建设是至关重要的。我们最长对比的Myisam和InnoDB引擎,随着时间的发展当前InnoDB基本一手遮天,后续详细梳理也将主要以InnoDB为主。

存储引擎负责着自己的内存管理、索引管理和数据的实际存储工作。

MySQL存储引擎是Table层面的

索引是由存储引擎管理维护的,其存储结构也是存储引擎决定的

物理文件

上文提到数据库是指一组按照特定数据模型组织的数据文件集合;这里的组件就是用于管理这些物理文件的,这部分功能基本上依靠存储引擎自己完成的。这部分包含的文件还有Redo、Undo Log,索引,Binary,ERROR、Slow、Query日志等。

这些文件的存储根据存储引擎不同可能有不同的差异,但是绝大多数情况还是依赖操作系统的文件系统;因为操作系统可以对数据库屏蔽不同的存储设备的差异,比如NTFS、ext、NAS、SAN等等。当然这也不是一定的,比如InnoDB就支持裸设备存储。

本文采用CC BY-SA许可发布,您可以自由的转载分享。

转载请保留出处 BeanMr.
http://blog.beanmr.com/2016/06/17/mysql-static-arch/