首先通过关键字将 SQL 语句进行解析,并且生成一个“解析树” 。MySQL 解析器将使用 MySQL 语法规则验证和解析查询,例如,关键字是否使用正确、关键字的顺序是否正确或者引号是否前后匹配等 。
预处理是根据一些 MySQL 规则进一步检查解析树是否合法,例如数据表和数据列是否存在,还会解析名字和别名,看看他们是否有歧义等 。
查询优化语法解析和预处理之后,你的需求就明白了,需要查询哪张表,查询的数据列是哪些、条件是什么等等 。但是使用怎么样的方式是最优查询方式呢?查询优化就是来干这个事的,MySQL 的优化程序会对我们的语句做一些优化,如外连接转换为内连接、表达式简化、子查询转为连接等等 。优化的结果就是生成一个执行计划,这个执行计划表明了应该使用哪些索引进行查询,表之间的连接顺序是啥样的 。
执行器执行器会执行查询优化后的执行计划,通过与存储引擎交互,完成数据的查询操作,返回最终的数据结果 。
开始执行的时候,要先判断一下你对这个表 T 有没有执行查询的权限,如果没有,就会返回没有权限的错误,如下所示 (在工程实现上,如果命中查询缓存,会在查询缓存返回结果的时候,做权限验证 。查询也会在优化器之前调用 precheck 验证权限) 。
mysql> select * from user where ID=1;ERROR 1142 (42000): SELECT command denied to user 'b'@'localhost' for table 'T'
如果有权限,就打开表继续执行 。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口 。
比如我们这个例子中的表 user 中,假设 ID 字段没有索引,那么执行器的执行流程是这样的:
1、调用 InnoDB 引擎接口取这个表的第一行,判断 ID 值是不是 10,如果不是则跳过,如果是则将这行存在结果集中;
2、调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行 。
【select * from user 这条 SQL 语句,藏着哪些不可告人的秘密?】3、执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端 。
到这里,执行 SQL 语句就执行完了,其实这内部还是非常复杂的 。
存储引擎到上面为止,SQL 语句就执行完了,但是与真实数据打交道的是存储引擎,存储引擎是 MySQL服务器对数据的存储和提取操作的封装模块 。我们知道表是由一行一行的记录组成的,但这只是一个逻辑上的概念,物理上如何表示记录,怎么从表中读取数据,怎么把数据写入具体的物理存储器上,这都是存储引擎负责的事情 。
为了实现不同的功能,MySQL提供了各式各样的存储引擎,不同存储引擎管理的表具体的存储结构可能不同,采用的存取算法也可能不同 。比如,MySQL5.7 之后默认的 InnoDB 存储引擎 。
可以看出一条 SQL 语句的执行还是非常复杂的,涉及到了很多的模块,文章到这里就结束了,感谢您的阅读,希望这篇文章对你的学习和工作有所帮助,如果您觉得文章有用,欢迎点赞+转发 。
最后觉得此文不错的大佬们可以多多关注或者帮忙转发分享一下哦,感谢!!!!
推荐阅读
- Linux useradd 命令介绍
- python首行代码import *,from * import * 解析
- Python中from import和import的区别?没有比这更好的回答了
- 深入理解UDP编程
- es6中Array.from和数组去重
- nginx使用set_real_ip_from获取用户真实IP
- 使用userdel命令删除用户账户 如何删除用户账户
- From|《艾尔登法环》不需要乔治马丁
- EXO ‘from happiness’ DVD12月开始销售
- 史上最全Python反爬虫方案汇总