网站建设制作 南京公司,服装定制流程,wordpress cms免费,网站导航一定要一样吗一条MySql执行过程
首先Mysql的架构分为两层#xff0c;Server层和存储引擎层。 Server层#xff1a;MySql大多数核心功能#xff0c;主要包括#xff0c;连接器#xff0c;查询缓存#xff0c;解释器#xff0c;预处理器#xff0c;优化器#xff0c;执行器等 存储引…一条MySql执行过程
首先Mysql的架构分为两层Server层和存储引擎层。 Server层MySql大多数核心功能主要包括连接器查询缓存解释器预处理器优化器执行器等 存储引擎层负责数据的获取和存储。innodbMyISAM
连接器
1.首先经过TCP三次握手随后进行权限验证若有问题则返回“Access denied for user”。若无问题则权限验证成功后续该用户在此连接里的任何操作都会基于连接开始时读到的权限进行权限逻辑的判断。所以如果一个用户已经建立了连接即使管理员中途修改了该用户的权限也不会影响已经存在连接的权限。修改完成后只有再新建的连接才会使用新的权限设置。 2.show processlist查看连接命令 3.其中Command 命令行为Sleep则代表为空闲连接空闲连接的最大空闲时长由 wait_timeout 参数控制的默认值是 8 小时28880秒 4.MySQL 服务支持的最大连接数由 max_connections 参数控制 5.有短链接执行一次SQL就建立并断开一次连接长连接在连接期间执行多条SQL 长连接占内存的问题如何解决 1.定期断开长连接 2.客户端主动重置连接这个过程不需要重连和重新做权限验证但是会将连接恢复到刚刚创建完时的状态。
查询缓存
这个查询缓存是以 key-value 形式保存在内存中的key 为 SQL 查询语句value 为 SQL 语句查询的结果。查询语句到来时先查询缓存若命中则返回若未命中则继续查询。 为什么查询缓存用处不大 只要一个表有更新操作那么这个表的查询缓存就会被清空。而更新操作是比较频繁的
解析SQL
1.词法分析。MySQL 会根据你输入的字符串识别出关键字出来如关键字SELECT,UPDATE,FROM等 2.语法分析。根据词法分析的结果语法解析器会根据语法规则判断你输入的这个 SQL 语句是否满足 MySQL 语法如果没问题就会构建出 SQL 语法树这样方便后面模块获取 SQL 类型、表名、字段名、 where 条件等等。
执行SQL
执行SQL主要有三个阶段 prepare 阶段也就是预处理阶段 optimize 阶段也就是优化阶段 execute 阶段也就是执行阶段
1.预处理器
主要做两件事1.检查查询语句中的表和字段是否存在。2. 将 select * 中的 * 符号扩展为表上的所有列
2.优化器
优化器主要负责将 SQL 查询语句的执行方案确定下来比如在表里面有多个索引的时候优化器会基于查询成本的考虑来决定选择使用哪个索引。
3.执行器
MySQL 就真正开始执行语句了这个工作是由「执行器」完成的。在执行的过程中执行器就会和存储引擎交互了交互是以记录为单位的。 主要三种方式执行过程执行器和存储引擎的交互过程如下 主键索引查询 执行器第一次查询会调用 read_first_record 函数指针指向的函数因为优化器选择的访问类型为 const这个函数指针被指向为 InnoDB 引擎索引查询的接口把条件 id 1 交给存储引擎让存储引擎定位符合条件的第一条记录。 存储引擎通过主键索引的 B 树结构定位到 id 1的第一条记录如果记录是不存在的就会向执行器上报记录找不到的错误然后查询结束。如果记录是存在的就会将记录返回给执行器 执行器从存储引擎读到记录后接着判断记录是否符合查询条件如果符合则发送给客户端如果不符合则跳过该记录。 执行器查询的过程是一个 while 循环所以还会再查一次但是这次因为不是第一次查询了所以会调用 read_record 函数指针指向的函数因为优化器选择的访问类型为 const这个函数指针被指向为一个永远返回 - 1 的函数所以当调用该函数的时候执行器就退出循环也就是结束查询了。 全表扫描 执行器第一次查询会调用 read_first_record 函数指针指向的函数因为优化器选择的访问类型为 all这个函数指针被指向为 InnoDB 引擎全扫描的接口让存储引擎读取表中的第一条记录 执行器会判断读到的这条记录的 name 是不是 iphone如果不是则跳过如果是则将记录发给客户的是的没错Server 层每从存储引擎读到一条记录就会发送给客户端之所以客户端显示的时候是直接显示所有记录的是因为客户端是等查询语句查询完成后才会显示出所有的记录。 执行器查询的过程是一个 while 循环所以还会再查一次会调用 read_record 函数指针指向的函数因为优化器选择的访问类型为 allread_record 函数指针指向的还是 InnoDB 引擎全扫描的接口所以接着向存储引擎层要求继续读刚才那条记录的下一条记录存储引擎把下一条记录取出后就将其返回给执行器Server层执行器继续判断条件不符合查询条件即跳过该记录否则发送到客户端 一直重复上述过程直到存储引擎把表中的所有记录读完然后向执行器Server层 返回了读取完毕的信息 执行器收到存储引擎报告的查询完毕的信息退出循环停止查询。 索引下推 索引下推能够减少二级索引在查询时的回表操作提高查询的效率因为它将 Server 层部分负责的事情交给存储引擎层去处理了。 不使用索引下推MySQL 5.6 之前的版本时执行器与存储引擎的执行流程是这样的 Server 层首先调用存储引擎的接口定位到满足查询条件的第一条二级索引记录也就是定位到 age 20 的第一条记录 存储引擎根据二级索引的 B 树快速定位到这条记录后获取主键值然后进行回表操作将完整的记录返回给 Server 层 Server 层在判断该记录的 reward 是否等于 100000如果成立则将其发送给客户端否则跳过该记录 接着继续向存储引擎索要下一条记录存储引擎在二级索引定位到记录后获取主键值然后回表操作将完整的记录返回给 Server 层 如此往复直到存储引擎把表中的所有记录读完。、 没有索引下推的时候每查询到一条二级索引记录都要进行回表操作然后将记录返回给 Server接着 Server 再判断该记录的 reward 是否等于 100000。 使用索引下推后判断记录的 reward 是否等于 100000 的工作交给了存储引擎层过程如下 Server 层首先调用存储引擎的接口定位到满足查询条件的第一条二级索引记录也就是定位到 age 20 的第一条记录 存储引擎定位到二级索引后先不执行回表操作而是先判断一下该索引中包含的列reward列的条件reward 是否等于 100000是否成立。如果条件不成立则直接跳过该二级索引。如果成立则执行回表操作将完成记录返回给 Server 层。 Server 层在判断其他的查询条件本次查询没有其他条件是否成立如果成立则将其发送给客户端否则跳过该记录然后向存储引擎索要下一条记录。 如此往复直到存储引擎把表中的所有记录读完。 可以看到使用了索引下推后虽然 reward 列无法使用到联合索引但是因为它包含在联合索引agereward里所以直接在存储引擎过滤出满足 reward 100000 的记录后才去执行回表操作获取整个记录。相比于没有使用索引下推节省了很多回表操作。