一条Select 语句的执行过程

  • Mysql 组成的结构
  • 客户端
  • 连接器
  • 缓存
  • 分析器
  • 优化器
  • 执行器
  • 写在最后


Mysql 组成的结构

DBeaver工具查看MySQL sql语句执行计划解释_sql

储存引擎还有其他的, 这里只是举个例子哟

客户端

客户端的作用是访问Mysql 的server层,相信大家第一次接触到Mysql, 然后…就啥都没了. 客户端就是用界面来与Mysql做交互的.
常用链接Mysql server层的方式有两种 :

  • 图形化界面工具:
  • NAVICAT 界面好看 功能强大, 但是收费
  • SQLYOG 刚开始学Mysql 的时候用的, 满足日常使用,收费!
  • DBEAVER 挺棒的, 公司就是用的好这个, 因为免费
  • 等等 …,
  • 命令行 (Linux/ Windows 都有)
[root@VM_0_16_centos ~]# mysql -u root -p   端口默认是3306
Enter password:  # 密码

连接器

连接器的作用是通过TCP握手获取登录信息后验证权限, 以及连接的管理.
关于长连接和短连接的区别&优缺点,可能需要新开一个章节来写…

缓存

你执行一条SQL(查询), 如果你没有手动禁用缓存的话, Mysql会先到缓存中查询之前是否执行过这条SQL, 有则视为命中缓存并且返回数据, 没有命中则交由,分析器处理.
需要注意的是增 删 改 都会刷新Mysql的缓存, 所以经常修改的的数据,不建议使用缓存.比如城市交通的线路,站名, 城市名,省名 这些长期不变的数据 则建议使用缓存,提高效率

分析器

分析器的作用是对你执行的SQL的解析, 检查你的语法是否能正常被Mysql的执行器执行.
分析器又分为: 词法分析语法分析

select stu_id,last_name from tbl_stu where stu_age > 10

 词法分析:分析的是将 tbl_stu 识别为表名 ,stu_id,last_name 识别为字段名 . 并且检查该用户是否有权限访问这张表, 该表是否存在 ,该字段名是否存在于表内.

 语法分析:分析的是语法是否正确 来看example

DBeaver工具查看MySQL sql语句执行计划解释_sql_02


明显 age 和 name 之间少了个 and 来连接查询条件, Mysql 就丢出了一个语法错误,而且报错信息很明确可以看出哪儿出错

DBeaver工具查看MySQL sql语句执行计划解释_数据库_03


当词法分析和语法分析都完全通过后.并不是直接执行. 还要到优化器

优化器

首要优化的是,选取哪个索引. 关于索引是个大学问,索引对我们一条SQL执行效率的影响是很大的,我想再研究一下再开一个章节来记录索引, 这里主要知道索引的选择是在优化器中进行的.走个流程.

select t1.emp_name,t1.emp_age,t2.dept_name
from tbl_emp t1
left join tbl_dept t2 on t1.dept_id = t2.dept_id 
where t1.salary >= 20000

其次还需要的优化是, 当一条sql复杂了. 其实Mysql 有很多执行方案.

比如这条相对简单的sql .到底先查出salary >= 20000 的呢 , 还是先查出 dept_id 相等的呢,Mysql有很多条路可以选 .但是不同选择执行的耗时截然不同. 越是大量的数据相差越明显, 举例一个复杂点的SQL

DBeaver工具查看MySQL sql语句执行计划解释_sql_04


优化后的SQL有了Mysql认为高效的执行步骤后就交付给执行器.

执行器

执行器首先要做的是检查是否有权限访问这张表, 然后再根据建表时的选用的储存引擎去调用该储存引擎的读写(IO)接口.

CREATE TABLE IF NOT EXISTS `tbl_stu`(
   `stu_id` INT UNSIGNED AUTO_INCREMENT,
   `stu_name` VARCHAR(100) NOT NULL,
   `stu_class` VARCHAR(40) NOT NULL,
   `stu_birth` DATE,
   PRIMARY KEY ( `stu_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;  -- ENGINE关键字选择数据库引擎

开始查询:
有索引走索引, 无索引走全表 .命中一条就返回一条到结果集中. 返回的同时也会放到缓存中方便下一次使用 .

写在最后

 第一次写文章发布在网上. 之前都是写在笔记软件中. 深知自己还水平到不到大神级别,没有源码级别的讲解.于是都是大白话的平铺直述 ,在此记录学习过程.如果有知识或者概念或者错别字上的问题 .请大家评论批评. 我会及时更正. 并且陆续会有更多的文章奉上.蟹蟹大家!