MySQL服务端结构

服务器处理客户端请求

客户端与服务端进行通信->都是客户端向服务端发送一段文本(sql),服务器进行处理后再向客户端发送一段文本(处理结果)。那么服务端是如何对客户端发来的信息进行处理的呢?先给出一个图了解一下。

从图中可以看出,客户端向服务端发送消息分为三个部分:连接管理、解析与优化、存储引擎

连接管理

客户端与服务端的连接有三种方式;TCP/IP、Unix域套接字、管道和内存 客户端进程连接到服务端进程时,服务器进程都会创建一个线程专门来处理与这个客户端进程的交互。当客户端断开连接时,服务端并不会将线程删除,而是缓存起来,这样的操作是避免频繁的创建进程与删除进程 。不过,线程分配过多也会严重影响系统性能,可以限制客户端连接服务端的数量,这个不在这里阐述。

当连接建立后,服务端就会一直等待客户端发来的消息,对发来的文本进行一系列的处理。

解析与优化

分为三部分:查询缓存、语法解析、查询优化

查询缓存

查询缓存可以在不同的客户端之间共享,如果客户端A刚刚查询了一个语句,而客户端B随后也查询了这个相同的语句,那么服务端就会在缓存中将数据返回给客户端B。不过,查询数据的格式如果不同,哪怕是发生了一点点的变化,都会导致缓存不会被命中。例如:用户自定义的函数,某些系统函数,如now()每次的时间都不同,当然缓存就不会被命中,查询发送了变化。还有文本sql语句不一致,如大小写不同,哪怕语句是相同的,也不会被查询到。

缓存也有失效的时候。缓存会监测每一张表。当该表的结构或数据发生变化 ,缓存都会失效。如:INSERT、 DELETE、UPDATE、TRUNCATE TABLE、DROP TABLE、ALTER TABLE、DROP DATABASE。

缓存虽然能提升系统的性能,但同时也需要对其进行维护,这些需要额外的开销。从MySQL5.7开始,不推荐使用缓存,并在MySQL8.0删除

语法解析

这一步是检测文本语法是否正确,本质上就是编译过程。

查询优化

在语法解析后,服务器就获取到了需要的信息,例如要查询的是哪张表、哪些列、搜索条件。不过,我们些的MySQL语句执行起来的效率不是很高,MySQL的优化程序 会对我们的语句进行一些优化,比如外连接转为内连接···优化的结果就是生成一个优化执行计划。这个执行计划在哪里查看呢?我们可以通过EXPLAIN语句查看某个语句的执行计划。

存储引擎

截止到查询优化步骤,其实都还没有真正接触到数据库表。MySQL服务器把数据的存储和提取都封装到了存储引擎中。 物理上如何记录,读取,写入数据都是存储引擎负责的事情。

为了方便管理,可以将连接管理,查询缓存,语法解析,查询优化这些并不真正涉及真实数据存储的功能划分为MySQL server 的功能,而将真实数据存储的功能划分为存储引擎的功能。各种不同的存储引擎都可以向上边MySQL server提供一个封装好的接口(存储引擎API)。

所以MySQL server完成了查询优化后,只需要按照优化的执行计划调用存储引擎提供的API就可以将获取到的数据返回给客户端。

相关推荐
AI 嗯啦1 小时前
SQL详细语法教程(三)mysql的函数知识
android·开发语言·数据库·python·sql·mysql
杰克尼3 小时前
mysql-条件查询案例
数据库·mysql
你那是什么调调5 小时前
`SHOW PROCESSLIST;` 返回列详解(含义 + 单位)
mysql
云心雨禅6 小时前
网站突然崩了,此站点遇到了致命错误!
服务器·mysql
Menior_9 小时前
【补充】数据库中有关系统编码和校验规则的简述
数据库·mysql·oracle
Kay_Liang10 小时前
从聚合到透视:SQL 窗口函数的系统解读
大数据·数据库·sql·mysql·数据分析·窗口函数
诺亚凹凸曼12 小时前
MySQLinnodb引擎普通索引和唯一索引的区别
数据库·mysql
星空下的曙光15 小时前
MySQL → SQL → DDL → 表操作 → 数据类型 知识链整理成一份系统的内容
数据库·sql·mysql
小志的博客19 小时前
mysql——count(*)、count(1)和count(字段)谁更快?有什么区别?
mysql
三体世界1 天前
Mysql基本使用语句(一)
linux·开发语言·数据库·c++·sql·mysql·主键