Mysql基础架构以及sql执行原理
1.1 Mysql官方给出的基础架构图
英文版的
中文版的
我用来记录的执行流程图(作图工具ProcessOn)
- Conncetors (连接器) 支持多种协议,多种语言。
例如 JDBC API, 简单的双层架构连接图,如下:
可以发现,JDBC的作用在于,它为Java与DBMS之间连接的提供了桥梁。也就是说,java平台或者是客户端平台想要对Mysql数据库进行操作,第一步就必须要与Mysql建立连接。
已知Mysql底层协议是TCP。那么客户端与Mysql连接时就需要经过"三次握手"。
举例:
client ---------->发送请求消息------->Mysql 第一次握手
Mysql受到请求,确认建立连接----------->发送响应---------->client 第二次握手 mysql给予权限
两次握手就已经可以确立连接关系!第二次握手后,mysql就会给client打开通信
那么如果client不再发送请求呢?!
结果只有一个,mysql会一直打开通道,等到client发消息为止,十年,二十年,一百年!
这期间浪费了多少系统资源?! 所以才需要第三次握手!
client-------->再次发送消息确认------->Mysql
这就是TCP协议典型的三次握手。
连接分为两种:
短连接:执行少量查询就会断开,浪费资源。
长连接:mysql保持连接状态,但是有默认连接时长, 为 28800秒。
- Managerment Service
这里主要是一些工具与系统管理,例如:备份与恢复,分区管理等。 - Connection Pool(连接池)
想要明白Pool,就要明白它的出现背景。首先,建立数据库连接与关闭数据库连接都是需要消耗服务器的资源的,那么在一个大项目中,从数据库获取数据再关闭数据库这些操作需要执行上百上千次,这样简直就是在白白浪费系统资源!所以就出现了pool的概念。
pool的目的在于对已经建立过一次连接的连接进行管理,实现资源重用,提高系统运行速度。 - Sql Interfaces (接口)
学习过面向对象编程的就不难理解接口这个概念。在mysql中,sql 接口的目的在于,接受命令,返回结果。 - Parser (解析器)
目的在于 对输入的命令进行校验,分析。
分析方式为两种:
词法分析:检测每个单词的含义;例如, * 就被解析成表的全部字段
语法分析:语法规则校验。 - Optimizer(优化器)
优化器的目的在于对命令(sql语句)进行优化,选出最优解,提高执行效率。
索引选择与sql执行顺序都会影响执行效率。
举例:
select * from e1 inner join e2 using(id) where e1.c = 10 and e2.d = 20;
两种执行方式:
先执行e1.c = 10,查询所有数据,再与e2关联,查出符合e2.d=20 的数据。
先执行e2.c=20 ,…
如果e2 与 e1 两张表的数据量差距太大,该怎么选择执行顺序呢? - Cache and Buffer
查询缓存,如果学过Java中的文件操作,就不难理解Buffer与Cache的概念。简单来说,这个东西的出现也是为了提高运行效率,减少消耗。
在mysql8.0 ,查询缓存已经被mysql官方删除掉了。因为一旦对已经缓存过的数据进行增删改,那么缓存就会失效,得不偿失,所以就给删了。
8.0之前还是可以用缓存的,但是缓存是默认关闭的。 - Pluggable Storage Enginers(可插式存储引擎)
例如ISAM储存引擎,可读取操作的速度快,不占用大量内存与储存资源。
InnoDB和BDB两种储存引擎包括了对事务处理和外来键的支持,这是他们与其他引擎的最大不同点。我以前一直用的就是InnoDB。 - File System
数据储存的地方 - 执行器
以Innodb储存引擎为例
select * from emp where deptno = 10
- 验证执行者是否有执行权限;
- 调用Innodb储存引擎,开始从第一行查起,depton=10的写入结果集,不等于的跳过。
- 将结果返回给client!
当明白这些概念之后,便可看执行流程图了,跟着序号走一走就Ok!