新更新详解 mysql结构与sql执行流程
mysql大体结构
客户端:PHP、Navicat等
服务端:
连接层: 主要是线程管理,对程序连接的管理 (用户密码等处理)
sql层: 解析sql,优化sql语句 )
存储引擎: innodb存储引擎,myisam存储引擎
流程:
用户=>php=>mysql=>php=>用户
连接层:用户密码等处理 (mysql -uroot -p)
↓
查询缓存(8.0之后废除)
sql层:(解析器=>sql解析器,语法解析器,优化器,sql语句接口)
↓
innodb存储引擎,myisam存储引擎
↓
磁盘
show variables like “%max_connections%” 查询最大的连接数
show processlist 查询当前用户的连接
连接长短之分:
短连接:开始连接–效验-数据查询-返回结果-关闭连接(sleep)
长连接:开始连接–效验-数据查询-返回结果–数据查询-返回结果–数据查询-返回结果—关闭连接(默认8小时)
审计、数据分批导出等用长连接
默认短连接足够日常使用
mysql的连接层
连接层:
- 连接之后的用户密码的效验
- 对于效验之后的连接进行线程分配管理
- 对用户效验->对于数据库表的操作权限的一个效验 host的值 localhost/127.0.0.1
- 返回连接的id show processlist 查询当前用户的连接
- -1 抛出异常
sql层解析器
sql层:
sql 的sql语句接口:接收到由连接层传递的sql语句
- 先判断下sql语句的类型
(query(select),dml(insert,update,delete),ddl(alter),status(show status) 等) - 假设是query (8.0之前:先判断查询缓存是否开启,开启->查询缓存看是否命中,命中->直接返回结果,没有则继续执行。8.0之后:解析器:sql解析器->语法解析器)
sql解析器:根据查询的sql语句将sql划分为小token(select,*,from,user,where,id,>,10)得到前面分解的token,根据token去进行排列组合(关键字and or)成解析树是根据where条件中的关键词来进行组合
优化器的执行
根据解析树=>选择合适的执行计划(这个计划不一定是最优的)
- 获取表结构信息(字段信息,字段的类型,存储的位置,索引信息)获取的信息是查询的表的信息,如果是join那就两张表的信息
- 根据解析树进行条件过滤->主要是一些没有意义的查询 1=1
- 索引信息 来确定/判断执行计划
- 执行这个计划 在索引及条件等来过滤