MySql一条Sql语句的执行流程
首先看下MySql的基本架构示意图
大体来说,MySql可以分为Server层和存储引擎层
Server层:
Server层包括连接器,分析器,优化器,执行器等,涵盖了MySql大部分的核心功能,以及所有的内置函数(日期,时间..)除此之外还包括跨引擎的功能,触发器,存储过程,视图等
存储引擎层:
主要负责数据的存储和提取,其架构模式是插件式的,如Innodb,MyISAM,Memory等,从MySql5.5.5版本开始Innodb就成为了MySql的默认的存储引擎了,当然在创建表的时候使用engine=memory来指定存储引擎
连接器:
连接器主要跟客户端进行连接,权限的校验,维持和管理连接。客户端命令是 mysql -u root -p,然后回车输入密码,可以直接在-p 后面输入密码,但是这样不安全,不建议这样操作。一个连接建立完成之后,即使使用管理员来对该用户进行权限修改也不会影响当前连接,只有重新建立连接才会使用新的权限设置。连接完成之后这个连接就处于空闲状态了,可以通过 show processlist来查看Command列,如果是Sleep状态,那么这个连接就是空闲状态。如果连接空闲时间太长就会自动关闭这个连接,默认是8小时,通过wait_timeout参数来是设置。
查询缓存:
如果Sql命中了缓存,那么就可以直接返回数据,不需要执行后面的操作,但是不建议使用缓存,MySql8.0甚至直接移除了这个模块,因为使用缓存的弊大于利,缓存虽然能帮我们提高查询效率,但是如果某张表有更新操作,难么缓存中所有这张表的记录都会被清空掉。你好不容易存储起来的缓存被一条更新记录全部清空,对于更新频繁的数据库来说,命中缓存的概率更低。我们可以通过设置参数query_cache_type设置成DEMAND,这样对于默认的SQL语句就不会使用缓存,如果实现需要使用缓存可以使用SQL_CACHE显示奖励,比如 select SQL_CACHE * from peopel;
分析器:
分析器首先做的是词法分析,比如select就是查询的,表明T,就转换成表明,字段ID就转换成字段ID,如果没有找到对应字段或者表的话就会报错,之后就是语法解析,校验写的Sql语句是否符合MySql语法,不符合也会报错
优化器:
sql语句没有问题,sql优化器就是表有多个索引的时候,选择决定使用哪个索引,或者在一个语句有多表join的时候,决定各个表的连接顺序,也就是一条Sql语句有多种执行方案,而优化器会选择效率最高的一种方式执行
执行器:
行器会首先判断有没有权限查看数据,然后从存储引擎根据查询条件获取所有的数据之后返回
至此,MySql的Sql执行流程就完成了