轻松理解Mysql结构与sql执行流程

it2024-01-12  60

Mysql优化---Mysql结构与sql执行

目录一、mysql大体结构客户端服务端 二、sql执行流程1. 连接层2. sql层3. 存储引擎层 三、Mysql查询执行总结与查询问题:

目录

一、mysql大体结构

客户端

PHP,Navicat等

服务端

连接层sql层存储引擎层

二、sql执行流程

1. 连接层

1.连接层(主要是线程连接的处理,对程序连接的管理) 1.1 连接之后对用户密码的校验 1.2 对于校验之后的连接进行线程分配管理 1.3 对用户校验 =》对于数据库表的操作权限的一个校验 1.4 返回连接id

powershell `show processlist;` -- 查看当前用户的连接 `show variables like "%max_connections%";` -- 查询最大连接数(一般没自己配置的是100-500之间

可以自己配置 在虚拟机或者Xshell(通过IP连接你的虚拟机) 输入命令:cat /etc/my.cnf 找到 max_connections=xxx(可以自己配置,最大值为1000) 连接分为 长连接与短连接(默认短连接) 频繁与数据进行通讯,且没有高并发的情况下的时候, 选择长连接(审计等) `PDO::ATTR_PERSISTENT => true //项目中开启长连接命令 注意---以上任意一步出现异常 都会抛出`

.

2. sql层

sql层(解析sql,优化sql语句) sql查询语句: select * from where id=1 and (age>21 or status=1); 2.1 sql的sql语句接口:接收到由连接层传递过来的sql语句 2.2 先判断下sql语句的类型(query(select),dml(delete,create,insert,update),ddl(alter),status(show status)等) 2.3 假设是query 数据库8.0之前:先判断查询缓存是否开启,如果开启查询缓存是否命中,如果命中,直接返回结构,反之,则继续执行 数据库8.0之后:解析器:sql解析器 语法解析器 2.4 sql解析器:将sql语句解析成小令牌 select,*,from,user,where,id,=,1,and,(,age,>,21,or,status,=,1,) 2.5 语法解析器:将小令牌解析成二叉树 (where后面的关键字 and、or)根据where条件中的关键词来进行组合 2.6 mysql优化器:根据解析树 =》选择合适的执行计划 (注意这个计划并不一定是最优的) 2.6.1 获取表结构信息(字段信息,字段的类型,存储的位置,索引信息)获取的信息是查询表的信息,如果是join 那就是两张表的信息 2.6.2 根据解析树进行条件过滤 过滤掉没有意义的条件(1=1,1!=2) 2.6.3 索引信息 来确定/判断执行计划 2.6.4 执行这个计划

3. 存储引擎层

3.存储引擎层(innodb存储引擎 myisam存储引擎 等) 3.1 查询执行引擎,并调用API接口到磁盘中查询数据 3.2 把查询结果返回给客户端,并存储查询结果

三、Mysql查询执行总结与查询问题:

Mysql整个查询执行过程,总的来说分为 5 个步骤 :

1.客户端向 MySQL 服务器发送一条sql请求(查询、新增、修改、删除等请求) 2.连接/线程处理对用户名密码的校验,校验成功后服务器首先检查查询缓存,如果命中缓存,则立刻返回存储在缓存中的结果,否则继续执行 3.服务器进行 SQL解析器把sql语句解析成token、再有语法解析器把每一个token排列成二叉树、再由优化器生成相对最优的执行计划 4.MySQL 根据执行计划,调用存储引擎的 API来执行查询 5.通过执行引擎将结果返回给客户端,同时存储查询结果

进程与线程的区别

怎么判断缓存是否可以命中

MySQL将缓存存放在一个引用表 (不要理解成table,可以认为是类似于 HashMap 的数据结构), 通过一个哈希值索引,这个哈希值通过查询本身、当前要查询的数据库、 客户端协议版本号等一些可能影响结果的信息计算得来。所以两个查询在任何字符上的不同 (例如 : 空格、注释),都会导致缓存不会命中

查询执行引擎

在完成解析和优化阶段以后,MySQL会生成对应的执行计划,查询执行引擎根据执行计划给出的指令逐步执行得出结果。 整个执行过程的大部分操作均是通过调用存储引擎实现的接口来完成,这些接口被称为 handler API。 查询过程中的每一张表由一个 handler 实例表示。实际上,MySQL在查询优化阶段就为每一张表创建了一个 handler实例, 优化器可以根据这些实例的接口来获取表的相关信息,包括表的所有列名、索引统计信息等。 存储引擎接口提供了非常丰富的功能,但其底层仅有几十个接口,这些接口像搭积木一样完成了一次查询的大部分操作

查询返回结果

查询执行的最后一个阶段就是将结果返回给客户端。即使查询不到数据,MySQL 仍然会返回这个查询的相关信息

六星教育--2008期mysql优化--李建宇
最新回复(0)