一条SELECT 语句的执行过程,简单的大白话讲解.

发布于:2021-10-19 12:57:52



一条Select 语句的执行过程
Mysql 组成的结构客户端连接器缓存分析器优化器执行器写在最后



Mysql 组成的结构


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


客户端

客户端的作用是访问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

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

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


优化器

首要优化的是,选取哪个索引. 关于索引是个大学问,索引对我们一条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

优化后的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关键字选择数据库引擎

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


写在最后

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

相关推荐

最新更新

猜你喜欢