MySql学习系列 -- MySql架构了解

版权声明:本文为博主原创文章,未经博主允许不得转载。如果感觉文章哪里写的不对或者存在疑问,欢迎留言,共同学习、进步! https://blog.csdn.net/ydm19891101/article/details/84665127

背景

虽然在日常项目开发中一直在使用MySql,但是对于MySql的很多细节东西知之甚微,如MySql的架构、执行计划树、存储引擎API。

于是,拜读了MySql的经典书籍 -- 高性能MySql,本系列的很多知识点是借鉴该书籍并结合自己的理解总结而成。本人非DBA大牛,才疏学浅,难免会有纰漏错误,欢迎大家留言评论,共同学习交流。

本系列的学习默认你有了一定的数据库基础,所以不是介绍什么是数据库,表、行、锁、SQL语句、记录这些基础的概念,如果你尚不具备这些基础,建议你先阅读 MySql基础教程

让我们开始MySql的学习之旅吧。

学习

相信在实际项目中,你一定遇到过以下情况

(1)生产环境你只能通过特定的机器访问数据库、普通账号下不能执行drop table

(2)使用explain select **  分析某条查询具体的执行过程,如会使用到哪个索引,是否用到了文件排序、是否使用了覆盖索引等

(3)设置查询缓存可以提高性

相信上面的很多知识大家只知道结论,却不知结论背后的很多细节。

如果你想要更好的了解MySql,一定要先了解它的架构!

逻辑架构

                                                                                                 图1                                                                                            

最上层的服务并不是MySQL所独有的技术,这是大多数C/S共有的类似架构 。比如连接处理,授权认证,安全性等等。

第二层值得关注(SQL Layer),这是MySQL的核心部分。 包括查询解析、分析、优化、缓存以及所有内置的函数(如日期、时间、数学运算、加密)等等。所有跨存储引擎的功能都在这一层实现,如存储过程、触发器、视图等。

第三层包括了存储引擎。存储引擎负责MySQL中数据的存储和获取。就像Linux众多的文件系统 一样。每个存储引擎都有自己的优点和缺陷。服务器是通过存储引擎API来与它们交互的。这个接口隐藏 了各个存储引擎不同的地方,对于查询层尽可能的透明。这个API包含了很多底层的操作。

虽然从图1看来MySQL 架构非常的简单,就是简单的两部分而已,但实际上每一层 中都含有各自的很多小模块,尤其是第二层 SQL Layer ,结构相当复杂的。下面我们就分别 针对 SQL Layer 和 Storage Engine Layer 做一个简单的分析。

1.Connectors

即是针对不同语言提供的各种API

2 Management Serveices & Utilities

MySql的各种高级应用,如备份&恢复、分片、复制

3 Connection Pool

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

4 SQL Interface

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

5 Parser

SQL命令传递到解析器的时候会被解析器验证和解析。解析器是由Lex和YACC实现的,是一个很长的脚本。
主要功能:
a . 将SQL语句进行语义和语法的分析,分解成数据结构,然后按照不同的操作类型进行分类,然后转发到后续步骤,以后SQL语句的传递和处理就是基于这个结构的。
b.  如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的

6 Optimizer

每个SQL在查询执行之前会使用查询优化器对查询进行优化,就是优化客户端请求的query。根据query语句和数据库中的一些统计信息,在一系列算法的基础上进行分析,得出一个最优的策略,告诉后面的程序如何取得这个 query 语句的结果,最终生成的是一个执行计划。

我们常常使用的explain就是用来查看优化器优化的最终结果。

7 Cache和Buffer

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

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

8 、存储引擎接口

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

OK,大概了解了一下MySql的架构,下一章节我们来学习一下MySql的常见存储引擎。

参考:

  MySql教程:http://www.runoob.com/mysql/mysql-tutorial.html

  MySql体系结构:https://www.2cto.com/database/201708/666159.html

猜你喜欢

转载自blog.csdn.net/ydm19891101/article/details/84665127