当前位置:   article > 正文

MySQL查询请求执行过程分析_mysql客户端发起查询请求

mysql客户端发起查询请求

目录

第一部分:连接管理

第二部分:解析与优化

查询缓存

语法解析

查询优化

第三部分:存储引擎

备注关于存储引擎的一些基本的操作

参考资料:


备注:只从一个整体上理解执行过程,过于细节的暂时不做分析。

MYSQL服务器程序在处理来自客户端查询请求时,大致需要处理流程可以分为三个部分:连接管理、解析与优化、存储引擎

注意:MYSQL服务器将处理请求过程有时可以简单分为server层和存储引擎层。其中,连接管理、解析与优化这些不涉及真实数据存取的功能划分为server层,存取真实数据的功能划分为存储引擎层。

第一部分:连接管理

MYSQL客服端进程和服务端进程之间一般存在三种通信方式建立连接:

  • TCP/IP:采用TCP作为基本的网络协议,通过IP+PORT方式进行进程连接,默认端口3306;
  • 命名管道和共享内存(前提是Windows用户)
  • UNIX域套接字(前提是UNIX用户)

每当一个客户端进程连接到服务器进程时,服务器进程都会创建一个线程来处理客户端的交互请求,MYSQL服务器会为每一个连接进来的客户端分配一个线程,但线程分配的太多会严重影响系统性能,所以需要配置来限制可以同时连接到服务器的客户端的数量。

在客户端程序发起连接时,需要携带主机信息、用户名、密码等信息,服务器程序会对客户端程序提供的这些信息进行验证,验证通过进行下一步操作。

总之,要访问数据库,首先要连接到数据库上,打交道的就是连接器。连接器负责跟客户端建立连接,获取客户端权限,身份认证,以及维持和管理连接。连接完成后,如果没有后续动作,会处于空闲状态,客户端太长时间没有动静,连接器会自动将连接断开,这个时间由参数wait_timeout控制,默认为8小时。

第二部分:解析与优化

MYSQL服务器接收到的请求只是一个文本消息,该文本还需要经过各种处理,其中比较重要的部分分别是查询缓存、语法解析和查询优化。

查询缓存

从MYSQL5.7.20开始,就不在推荐使用缓存(MySQL服务器团队的一篇博文有介绍:MySQL :: MySQL 8.0: Retiring Support for the Query Cache),在MYSQL8.0中已经将其删除。原则:

  • 命中---查询不包含系统函数、用户自定义变量和函数、系统表,同时要求完全相同的key(对任何字符都敏感)
  • 失效:缓存系统监控涉及的每一张表,只要该表结构或者数据有变动,缓存就失效。

语法解析

针对文本进行分析:判断请求的语法是否正确,然后从本文中将要查询的表、各种查询条件都取出来放到MYSQL服务器内部使用的一些数据结构上。

MYSQL服务器会获得基本需要的信息,比如要查询的表和列是哪些、搜索条件是什么等信息

查询优化

MYSQL服务器的优化程序会对我们的语句做一些优化,如外连接转化为内连接、表达式简化、子查询转为连接等一系列内容。

优化的结果就是生成一个执行计划,这个执行计划表明了应该使用哪些索引执行查询,以及表之间的连接顺序等等,我们可以通过explain语句来查看某个语句的执行计划,这部分简单的可以查看以下两遍来了解:

https://zyfcodes.blog.csdn.net/article/details/116803687

第三部分:存储引擎

常观上,表是由一行一行的记录组成的,但只是一个逻辑上的概念,映射到物理层面就是存储引擎的事了,MYSQL服务器将数据的存储和提取操作都封装到了存储引擎模块中。

为了实现不同的功能,MYSQL提供了各式各样的存储引擎,不同存储引擎管理的表有不同的存储结构,采用的存储算法也是不一样的。

常用的存储引擎有很多,最常用的就是InnoDB和MyISAM,偶尔还会提一下MEMORY,重点学习InnoDB存储引擎,后续博客中对于InnoDB进行总结和学习规划。

备注关于存储引擎的一些基本的操作

查看当前服务器程序支持的存储引擎

show engines;

设置表的存储引擎

  • 创建表时指定存储引擎
  1. create table 表名(
  2. 建表语句;
  3. ) ENGINE = 存储引擎名称;
  • 修改表的存储引擎
alter table 表名 engine = 存储引擎名称;

MySQL数据库区别于其他数据库最重要的一个特性就是它支持插件式存储引擎。尤其是,存储引擎是基于表的,每个存储引擎都有各自的特点,我们可以根据具体的应用场景选择不同存储引擎来建表,充分发挥各存储引擎的优势。InnoDB和MyISAM是MySQL最常用的存储引擎,在5.5.8版本前默认存储引擎是MyISAM,由于InnoDB具有更强大丰富的特性,之后的版本默认存储引擎便替换成了InnoDB。

由于MySQL数据库开源特性,MySQL官方和第三方都提供了很多种存储引擎,下面对几种较为广知的存储引擎做一下对比

特性

InnoDB

MyISAM

Memory

Archive

存储成本

N/A(内存)

非常低

存储限制

64TB

256TB

RAM

None

内存成本

中等

批量插入速度

非常高

事务支持

✔️

✖️

✖️

✖️

锁粒度

行级锁

表级锁

表级锁

行级锁

支持哈希索引

✔️

✖️

✔️

✖️

支持聚簇索引

✔️

✖️

✖️

✖️

支持全文索引

✔️

✔️

✖️

✖️

支持外键

✔️

✖️

✖️

✖️

支持B+树索引

✔️

✔️

✔️

✖️

支持MVCC

✔️

✖️

✖️

✔️

参考资料:

1.《MYSQL是怎样运行的 --- 从根上理解MYSQL》,小孩子4919著,人民邮电出版社。

2.《MySQL实战45讲》,林晓斌(丁奇),极客时间。

3.https://zyfcodes.blog.csdn.net/article/details/116803687

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/278633?site
推荐阅读
相关标签
  

闽ICP备14008679号