mysql执行sql语句过程
开发人员基本都知道,我们的数据存在数据库中(目前最多的是mysql和oracle,由于作者更擅长mysql,所以这里默认数据库为mysql),服务器通过sql语句将查询数据的请求传入到mysql数据库。数据库拿到sql语句以后。都是进行了哪些操作呢?这里向大家介绍下我的个人的理解,欢迎大家评论区批评指正。
流程概述
mysql得到sql语句后,大概流程如下:
1.sql的解析器:负责解析和转发sql
2.预处理器:对解析后的sql树进行验证
3.查询优化器:得到一个执行计划
4.查询执行引擎:得到数据结果集
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的规则,检查解析树是否合法。(表格是否存在,别名是否有歧义等)
查询优化器
查询优化器获取到执行计划然后由查询执行引擎执行相应的操作。查询优化器,是数据库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会同时将结果集放到查询缓存中。然后将查到的结果集返回。如果是增删改操作,那么返回执行语句后受影响的行数。
mysql执行sql语句过程的更多相关文章
- 不登录到MySQL执行SQL语句
mysql -e 不登录到MySQL执行SQL语句 mysql -u root -p -e "SHOW DATABASES"
- mysql执行SQL语句时报错:[Err] 3 - Error writing file '/tmp/MYP0G1B8' (Errcode: 28 - No space left on device)
问题描述: 今天一同事在mysql中执行SQL语句的时候,报了/tmp空间不足的问题,报错如下: [SQL] SELECT f.prov as 字段1, MAX( CASE f.flag_name W ...
- 使用Mysql执行SQL语句基础操作
SQL: 又叫结构化语言,是一种用来操作RDBMS的数据库语言,在关系型数据库中都支持使用SQL语句,如oracle.mysql等等. 注意: 在关系型数据库中sql语句是通用的,而在非关系型数据库 ...
- mysql 执行 sql 语句提示Parameter '@XXX' must be defined
执行 sql 语句 MySqlException: Parameter '@maxNo' must be defined. 执行 sql 中含有自定义变量 @maxNo,抛出异常 解决方法: 连接字符 ...
- mysql 执行sql语句执行问题
SQL是一套标准,全称结构化查询语言,是用来完成和数据库之间的通信的编程语言,SQL语言是脚本语言,直接运行在数据库上.同时,SQL语句与数据在数据库上的存储方式无关,只是不同的数据库对于同一条SQL ...
- PHP获取MySQL执行sql语句的查询时间
//计时开始 runtime(); //执行查询 mysql_query($sql); //计时结束. echo runtime(1); //计时函数 function runtime($mode=0 ...
- (转载)PHP怎么获取MySQL执行sql语句的查询时间
(转载自CSDN) 方法一: //计时开始 runtime(); //执行查询 mysql_query($sql); //计时结束. echo runtime(1); //计时函数 function ...
- 如何用VS EF连接 Mysql,以及执行SQL语句 和存储过程?
VS2013, MySQL5.7.18 , MySQL5.7.14 执行SQL语句: ztp_user z = new ztp_user(); object[] obj = new object[] ...
- JDBC进阶之PreparedStatement执行SQL语句(MySQL)
一.什么是PreparedStatement 参阅Java API文档,我们可以知道,PreparedStatement是Statement的子接口(如图所示),表示预编译的 SQ ...
随机推荐
- Oracle表空间不足;查询表空间使用率(unable to extend lob segment SYS_LOB0000076749C00006$$ by 8192 in tablespace USERS)
查询表空间对应地址 *),) total_space from dba_data_files order by tablespace_name; //方案一:修改表空间大小(32000可改为想要的数值 ...
- eclipse详细安装教程与环境变量设置
地址:https://blog.csdn.net/q651742112/article/details/73477400 源地址:https://www.cnblogs.com/yeminglong/ ...
- C# 面试知识点网络文档整理
一 C# .NET技术 1.ASP.NET MVC如何控制权限? 2.C#.NET中的CTS.CLS和CLR? 3.什么是多线程,如何创建和如何使用?请写一个多线程单例模式? 4.什么是单例模式? 5 ...
- asp.net 实现后台异步处理的方式
问题描述: 刚刚开发的一个页面,使用的NET的MVC4.5框架,因为页面数据加载慢需要优化,页面上有8个请求,但是请求并没有什么相互依赖的关系.前端使用ajax异步,但是后台并没有按照异步程序处理.解 ...
- 在windows 10 上使用aspnet_regiis.exe -i 命令报 “此操作系统版本不支持此选项” 的解决办法
用CMD窗口在C:\Windows\Microsoft.NET\Framework64\v4.0.30319下使用命令aspnet_regiis -i 报错: “此操作系统版本不支持此选项” .结果是 ...
- Hadoop2.0环境安装
0. Hadoop源码包下载 http://mirror.bit.edu.cn/apache/hadoop/common 1. 集群环境 操作系统 CentOS7 集群规划 Master 192.16 ...
- java中PriorityBlockingQueue 和DelayedWorkQueue 区别
java中PriorityBlockingQueue 和DelayedWorkQueue 区别
- mysql日期 获取本月第一天 获取下个月的第一天
--获取当前日期 select curdate(); --获取当月最后一天 select last_day(curdate()); --获取本月第一天 select DATE_ADD(curdate( ...
- js实现reqire中的amd,cmd功能
js实现reqire中的amd,cmd功能 ,大概实现了 路径和模块 引入等重要功能. 本帖属于原创,转载请出名出处. <!DOCTYPE html PUBLIC "-//W3C//D ...
- tensorflow 升级到1.9-rc0,生成静态图frozen graph.pb本地测试正常, 在其他版本(eg1.4版本)或者android下运行出错NodeDef mentions attr 'dilations' not in Op<name=Conv2D; signature=input:T, filter:T -> output:T; attr=T:type,allowed=[DT_
这时节点定义找不到NodeDef attr 'dilations' not in,说明执行版本的NodeDef不在节点定义上,两个不一致,分别是执行inference的代码和生成静态图节点不一致(当然 ...