Mysql架构是什么?实际可以理解为执行一条sql语句所要经历的阶段有哪些!
1.连接层
(1)客户端发起连接
客户端通过TCP/IP、Unix Socket或命名管道等方式向Mysql服务器发起链接请求
想要了解tcp与udp的区别,可以参考这篇文章
https://blog.csdn.net/ymb615ymb/article/details/123449588?ops_request_misc=%257B%2522request%255Fid%2522%253A%252293c621ab4e488bbc0967bd9f87bd4418%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=93c621ab4e488bbc0967bd9f87bd4418&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-123449588-null-null.142^v102^pc_search_result_base7&utm_term=tcp%E4%B8%8Eudp%E7%9A%84%E5%8C%BA%E5%88%AB&spm=1018.2226.3001.4187
(2)服务端接受链接
当mysql服务器接收到客户端发来的请求后,服务器会建立一个线程或者连接句柄来处理客户端 的请求
大致来讲,如果把mysql服务器当做一个进程的话,那么与每个客户端建立的链接则可以当做一个线程
(3)身份验证
连接层会验证客户端提供的用户名和密码
验证通过后,连接层会检查客户端是否有权限访问指定的数据库
如果验证失败,连接层会拒绝链接并返回错误信息
(4)处理客户端请求
客户端发送sql查询或者其他请求
连接层将请求传递给查询解释器和优化器(解释器和优化器在后面会讲到)进行处理
查询执行完成后,连接层将结果返回给客户端
(5)关闭链接
2.缓存层
缓存层是mysql中比较鸡肋的部分....
与其他应用中的缓存器一样,mysql缓存层目的是为了减少数据库负载(即多次查询相同的数据库内容),提高反应速度
但是mysql是通过sql语句来记录是否执行缓存层的,什么意思?
如我想查询学生表中的所有信息,理论上 select * from students 与 select * from students查询的结果是一样的,但是两个语句之间空格数量一样,缓存层就会认为这是不同的语句,无法发挥缓存的作用
所以mysql5.6/5.7版本中存在缓存层,但是默认是关闭的,而mysql.8.0则是直接去掉了缓存部分,用相应的业务层来做缓存
3.解释层
(1)解析sql语句
解析sql语句会用到解析器组件(如第三方解析器组件Druid)
解析sql语句步骤:
客户端将sql语句传到mysql服务器->解析该sql语句 词法和语法解析(关键字、条件、判断表和字段是否存在)->生成解析树
(2)交给优化层
4.优化层
要想从北京去往上海是有多条路径的但是哪个是最优路径呢,那就得交给优化层了
(1)对于整个sql进行优化 优化器会对sql的条件进行调整 生成各种执行计划
(2)对sql进行具体优化 去掉没必要的条件 EXPLAIN SELECT * FROM USER WHERE 1=1; SELECT*FROM USER;
(3)优化器会选择合适的索引 但优化器不是万能的并不能全部优化成功 需要人工干预 慢查询就是例子
5.执行器与存储引擎
存储引擎在MySQL的逻辑架构中位于第三层,负责MySQL中的数据的存储和提取。MySQL存储引擎有很多,不同的存储引擎保存数据和索引的方式是不同的。每一种存储引擎都有它的优势和劣势。
可以使用 show engines; 命令来查看当前数据库所支持的所有的存储引擎。
举例:
有的时候可能需要查询速度快,不需要持久化,基于内存的操作,那么可以使用memory引擎。
有的数据是历史数据,基本上不会新增及其查询,提供压缩的功能就可以使用archive引擎。
有的时候需要非常多的 读写,并发,数据一致性的操作,可以使用innodb引擎。