MySql基础架构以及SQL语句执行流程

01. mysql基础架构

SQL语句是如何执行的

学习一下mysql的基础架构,从一条sql语句是如何执行的来学习。

一般我们写一条查询语句类似下面这样:

select user,password from mysql.user;

这样就可以返回一个结果,但却不知这条语句的内部执行流程。

如下是mysql的逻辑架构图:

Mysql可以分为Server层和存储引擎层二部分。

Server层有连接器/缓存/分析器/优化器/执行器,涵盖了mysql的很多核心功能。

存储引擎层负责数据的存储和读取,支持Innodb,MyIsam,Memory,BlackHole等,Mysql5.5版本后默认的存储引擎是Innodb。

接下来我们一层一层来看SQL语句的执行过程。

1)连接器

首先客户端连接mysql时就是连接到了连接器上,连接器负责跟客户端建立连接/校验用户身份,获取权限。连接命令一般如下:

mysql -h ip地址 -P 端口 -u 用户 -p

当客户端输入完了用户名和密码开始连接时,连接器会校验:

  • 如果用户名或者密码不正确,客户端会收到一个“Access denied for user”的错误。
  • 如果用户名和密码校验正确,连接器会检查用户所拥有的权限。之后,这个连接里的权限逻辑判断,都依赖此时读到的权限。

这就意味着一个用户成功建立连接之后,即使你用管理员把这个用户的权限更改了,也是不会影响到已经连接的这个用户,除非这个用户断开重新连接。让连接器重新读取权限才可以。

2)查询缓存

连接建立成功之后,你就能够执行select等语句了,这时就会进行第二步:查询缓存

Mysql收到一个sql请求之后,先检查缓存,看看之前是不是有执行过。如果执行过并缓存没有过期,结果会以key-value的形式存储在内存中,key是查询语句,value是查询结果。如果有缓存,直接把对应的value返回给客户端。

如果语句不在查询缓存中,就会向下执行下面的阶段,执行完成后,会把结果放到缓存中。

查询缓存的失效很平凡,因为只要更新一个表,那么这个表的所有查询缓存结果都会被清空,所以对经常变更的表,查询缓存的命中率很低。除非这个表数据比较稳定,不经常改变,才适合查询缓存。

了解下:Mysql8.0版本之后,查询缓存的功能就被删了。

3)分析器

如果没用命中缓存,分析器就开始工作了,对sql语句进行解析。

首先分析器会做“词法分析”,你输入的多个字符加上空格组成的sql语句,分析器需要分析出来里面字符分别都代表什么。

如从你输入的"select"关键字开始,mysql知道这是一个查询语句,然后分析出那个是表名,那个是你输入的条件等等。

做完了词法分析,开始做“语法分析”,根据词法分析的结果,语法分析会判断你输入的这条sql语句是否符合Mysql语法。

如果你的语句不对,就会收到“You have an error in you SQL syntax”的错误提醒,如果下面这个语句select少打了开头的字母“s”。

mysql> elect * from stu;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'elect * from stu' at line 1

一般语法错误会提示第一个出现错误的位置,所以你要关注的是紧接着“use near”后面的内容。

4)优化器

经过了分析器,Mysql已经知道你要做什么了,在开始执行之前,还需要经过优化器的处理。

优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联的时候,决定各个表的连接顺序。

5)执行器

Mysql通过分析器知道了你要做什么,通过优化器知道了如何做,接下来就是执行器开始执行语句;

开始执行之前, 会先判断你对要操作的表或库有没有权限,如果没有就返回权限的错误。

如果有权限,就打开表继续执行。打开表的时候,执行器会根据表的引擎定义,去使用这个引擎提供的接口。

比如这个select语句:select * from db1 where ID=100;

  • 先调用Inodb引擎接口获取表的第一行,判断ID值是不是100,如果不是则跳过,如果是则将结果存在结果集中;
  • 调用引擎接口获取“下一行”,重复相同的判断逻辑,直到读取这个表的最后一行。
  • 执行器将上述遍历过程所有符合要求的结果返回给客户端。

至此,这个select语句算是执行完了。

数据库的慢查询日志中会看到rows_examined的字段,表示这个语句执行过程中扫描了多少行。这个值就是在执行器每次调用引擎获取数据行的时候累加的。

有些情况下,执行器调用一次,在引擎内部则扫描了多行,因此引擎扫描行数跟rows_examined并不完全相同。

这样Mysql的逻辑架构和流程过了一遍,我也对整个sql语句的执行过程的各个阶段有了一个初步的认识。也希望能对大家有帮助。

原文地址:https://www.cnblogs.com/Tao9/p/11431014.html

时间: 2024-08-05 10:03:25

MySql基础架构以及SQL语句执行流程的相关文章

统计mysql里每条SQL语句执行的时间

概述 通常为了测试一些工具的性能,不得不用数据说话.数据可以客观地证实一些东西.例如关于一些数据库中间件的性能,对于一个初学者来说只会看到表面上的夸词.我们不得不去证实,那就用具体的查询语句测试.然而每每在执行完一条语句,眼巴巴的看着黑屏一类的客户端,不由得打瞌睡走神,统计起来也头疼. 方法 打开mysql客户端 mysql -h127.0.0.1 -uroot -proot -P3306 选择数据库 use dbtest; 设置profiling set profiling=1; 执行SQL语

mysql优化--explain分析sql语句执行效率

Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句. Explain语法:explain select - from - [where -] 例如:explain select * from news; 输出:+----+-------------+-------+-------+-------------------+---------+-

Mysql explain分析sql语句执行效率

mysql优化–explain分析sql语句执行效率 Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句. Explain语法:explain select - from - [where -] 例如: explain select * from news where id = 1; 输出: id select_type table type

[转] Oracle sql 语句执行过程图文分析

[原文链接]  http://nvd11.blog.163.com/blog/static/200018312201301310585758/ [原文视频]  http://www.jiagulun.com/thread-2674-1-1.html 1. 数据库文件Oracle 数据库文件大概可分为3种,分别是:控制文件(control files): 存放数据库本身物理结构信息数据文件(data files): 存放数据库数据啦~日志文件(log files):  包括重做日志文件和归档日志文

MyBatis源码分析-SQL语句执行的完整流程

MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录.如何新建MyBatis源码工程请点击MyBatis源码分析-IDEA新建MyBatis源码工程. MyBatis框架主要完成的是以下2件事情: 根据JD

mysql优化(三)–explain分析sql语句执行效率

mysql优化(三)–explain分析sql语句执行效率 mushu 发布于 11个月前 (06-04) 分类:Mysql 阅读(651) 评论(0) Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句. Explain语法:explain select … from … [where …] 例如:explain select * from

mysql之sql语句执行过程

1.SQL语句执行过程  1.客户端发送一条sql查询语句给服务器;     2.服务器通过权限检查之后,首先会检查查询缓存,如果命中了缓存,则立即返回 存储在缓存中的结果,否则进入下一步;     3.服务器端进行sql解析,预处理,再由查询优化器根据该sql所涉及的数据表的统计信息进行计算,生成对应的执行计划;     4.mySQL根据查询优化器生成的执行计划,调用存储引擎的API来执行查询;      5.将查询结果返回给客户端;    2.SQL语句执行过程的注意事项 1.在执行查询时

mysql基础操作、sql技巧和sql的常见优化

一.常见操作 1.复制表结构create table t2 like t1 复制表数据insert into t2 select * from t1 2.mysql索引 alter table用来创建普通索引.unique索引或primary key索引 alter table t add index index_name(column_list) alter table t add unique(column_list) alter table t add primary key(column

oracle学习笔记 SQL语句执行过程剖析讲课

oracle学习笔记 SQL语句执行过程剖析讲课 这节课通过讲述一条SQL语句进入数据库 和其在数据库中的整个的执行过程 把数据库里面的体系结构串一下. 让大家再进一步了解oracle数据库里面的各个进程.存储结构以及内存结构的关联关系. 首先来讲整个体系中有客户端.实例和数据库 数据库里有三类文件 控制文件ctl.数据文件dbf.日志文件log 实例中SGA有六大池子 第一大内存区shared pool即共享池 第二大内存区buffer cache 第三块是redo log 我们主要讲上面的三