ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

从连接到存储:解析MySQL查询请求的执行流程

从连接到存储:解析MySQL查询请求的执行流程 目录第一部分连接管理第二部分解析与优化查询缓存语法解析查询优化第三部分存储引擎备注关于存储引擎的一些基本的操作参考资料干货分享感谢您的阅读备注只从一个整体上理解执行过程过于细节的暂时不做分析。MYSQL服务器程序在处理来自客户端查询请求时大致需要处理流程可以分为三个部分连接管理、解析与优化、存储引擎。注意MYSQL服务器将处理请求过程有时可以简单分为server层和存储引擎层。其中连接管理、解析与优化这些不涉及真实数据存取的功能划分为server层存取真实数据的功能划分为存储引擎层。第一部分连接管理MYSQL客服端进程和服务端进程之间一般存在三种通信方式建立连接TCP/IP采用TCP作为基本的网络协议通过IPPORT方式进行进程连接默认端口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;设置表的存储引擎创建表时指定存储引擎create table 表名( 建表语句; ) ENGINE 存储引擎名称;修改表的存储引擎alter table 表名 engine 存储引擎名称;MySQL数据库区别于其他数据库最重要的一个特性就是它支持插件式存储引擎。尤其是存储引擎是基于表的每个存储引擎都有各自的特点我们可以根据具体的应用场景选择不同存储引擎来建表充分发挥各存储引擎的优势。InnoDB和MyISAM是MySQL最常用的存储引擎在5.5.8版本前默认存储引擎是MyISAM由于InnoDB具有更强大丰富的特性之后的版本默认存储引擎便替换成了InnoDB。由于MySQL数据库开源特性MySQL官方和第三方都提供了很多种存储引擎下面对几种较为广知的存储引擎做一下对比特性InnoDBMyISAMMemoryArchive存储成本高低N/A内存非常低存储限制64TB256TBRAMNone内存成本高低中等低批量插入速度低高高非常高事务支持✔️✖️✖️✖️锁粒度行级锁表级锁表级锁行级锁支持哈希索引✔️✖️✔️✖️支持聚簇索引✔️✖️✖️✖️支持全文索引✔️✔️✖️✖️支持外键✔️✖️✖️✖️支持B树索引✔️✔️✔️✖️支持MVCC✔️✖️✖️✔️参考资料1.《MYSQL是怎样运行的 --- 从根上理解MYSQL》小孩子4919著人民邮电出版社。2.《MySQL实战45讲》林晓斌丁奇极客时间。3.https://zyfcodes.blog.csdn.net/article/details/116803687
返回列表