mysql执⾏sql语句过程
  开发⼈员基本都知道,我们的数据存在数据库中(⽬前最多的是mysql和oracle,由于作者更擅长mysql,所以这⾥默认数据库为mysql),服务器通过sql语句将查询数据的请求传⼊到mysql数据库。数据库拿到sql语句以后。都是进⾏了哪些操作呢?这⾥向⼤家介绍下我的个⼈的理解,欢迎⼤家评论区批评指正。
流程概述六爻asp源码
  mysql得到sql语句后,⼤概流程如下:
  1.sql的解析器:负责解析和转发sql
  2.预处理器:对解析后的sql树进⾏验证
c语言对数组元素进行运算
  3.查询优化器:得到⼀个执⾏计划
  4.查询执⾏引擎:得到数据结果集
program汉语
  5.将数据放回给调⽤端。
流程图如下所⽰:
属性克制表 神奇百科
分发器及缓存阶段
  ⾸先,如果系统的缓存功能开启着的话,sql语句进⼊mysql后,sql进⾏判断,是否为select关键字。如果是,那么先去查询缓存中进⾏查询,如果在查询缓存中可以命中sql语句,那么直接返回查询缓存中的查询语句对应的value值(在缓存中,把查询语句做⼀个hash运算,结果作为key值,查询的结果集为value)。
  如果命中缓存的话,查询速度是相当快的。但是查询缓存也有它相应的缺点。
  ⾸先,开启缓存的话,服务器会消耗⼤量的内存空间;其次,缓存有的时候并不适⽤;最后,有的情况下,开启缓存也不会将对应的sql语句写⼊缓存。
缓存不适⽤的情况:
  缓存的锁的⼒度⽐较⼤,⽽且对于动态sql的⽀持度不够。
  缓存在数据进⾏更新的时候,是进⾏的表级锁,更新结束后,会把所有与更新内容相关的缓存全部删除。所以,如果表的写⼊⽐较多的话,缓存是⽐较浪费性能的。如果写⼊特别多,可能缓存反⽽会导致mysql变慢。
查询不到缓存的情况:
  1.查询条件有不确定数据:如now ,current_time等。
  2.缓存对⼤⼩写敏感,如select * from test 和SELECT* FROM test 就不会解析为同⼀条sql
电脑课专用代码
查询带来的额外开销:
  1.开始前需要先检查缓存是否命中。
  2.结果输出的时候,需要额外进⾏数据的缓存操作。
  3.写⼊数据时,mysql会将对应表的所有缓存都设置为失效。当缓存内存较⼤的时候,会导致系统消耗较⼤。
sql的解析器与预处理
  sql解析器是在命令分发之后,将对应的sql语句,解析为sql解析树。sql解析树是Mysql本⾝内部的语法规则和解析查询。验证是否使⽤错误的关键字,sql语法顺序是否正确等。(语法层⾯的错误)
  解析完成后,进⾏查询语句预处理器,根据mysql的规则,检查解析树是否合法。(表格是否存在,别名是否有歧义等)
查询优化器
mysql语句转oracle  查询优化器获取到执⾏计划然后由查询执⾏引擎执⾏相应的操作。查询优化器,是数据库l的⼀个核⼼模块,分为cbo和rbo两种。
  其中,rbo是基于规则的优化器。(rbo在oracle早期版本中使⽤,现在也保留,不过默认为cbo。mysql没有rbo优化器)
  这些规则是硬编码在数据库的代码中的。rbo会根据输⼊的sql语句可以匹配到的优先级最⾼的规则去作为执⾏计划。例如:在rbo中有这么⼀条规则:有索引的情况下,使⽤索引。那么所有的带有索引的表在执⾏的时候,都会⾛索引。rbo最⼤的问题在于,通过固定规则来决定执⾏计划。并不会考虑sql中涉及的对象的数量和分布。有可能选出来的规则不是最优的执⾏计划。
  cbo 是基于成本的优化器(基于统计信息),从⽬标诸多的执⾏路径中选择⼀个成本最⼩的执⾏路径来作为执⾏计划。成本指的是mysql根据相关的统计信息,算出来sql语句对应的io,cpu等的消耗的⼀个估计值。计算过程涉及到索引、表、⾏等数据,过程⽐较复杂。
  1.查询优化器使⽤统计信息为sql选择执⾏计划。
  2.mysql没有数据直⽅图,也⽆法⼿⼯删除统计信息。(oracle有)
  3.在服务器曾有查询优化器,却没有保存数据和索引统计信息。统计信息由存储引擎实现,不同的存储引擎会存储不同的统计信息。
  4.统计信息分为索引的统计信息和表的统计信息。
查看统计信息
  索引统计信息
  show index from table 或information_schema.statistics表
  表统计信息
  show table status like 或 information_schema.tables表
查询执⾏引擎+返回数据给客户端
  得到执⾏计划后,根据已有的执⾏计划,查询执⾏引擎,mysql的SQL Layer层,调⽤Storage Engine Layer层的接⼝,从mysql的存储引擎中获取到相对应的结果集,然后返回给⽤户。
  执⾏完成后,将结果返回给客户端,如果是查询语句,并且开启了缓存,那么,mysql会同时将结果
集放到查询缓存中。然后将查到的结果集返回。如果是增删改操作,那么返回执⾏语句后受影响的⾏数。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。