欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

一条查询sql的执行流程和底层原理

程序员文章站 2022-05-29 12:03:18
1、一条查询SQL执行流程图 2、查询SQL执行流程之发送SQL请求 (1)客户端按照Mysql通信协议将SQL发送到服务端,SQL到达服务端后,服务端会单起一个线程执行SQL。 (2)执行时Mysql首先判断SQL的前6个字符是否为select。并且语句中是否带有SQL_NO_CACHE关键字,如 ......

1、一条查询sql执行流程图

一条查询sql的执行流程和底层原理

2、查询sql执行流程之发送sql请求

(1)客户端按照mysql通信协议将sql发送到服务端,sql到达服务端后,服务端会单起一个线程执行sql。

(2)执行时mysql首先判断sql的前6个字符是否为select。并且语句中是否带有sql_no_cache关键字,如果没有则进入查询缓存。

3、查询sql执行流程之查询缓存

查询缓存说白了就是一个哈希表,将执行过的语句及其结果以键值对的格式缓存到内存中。其中key是一个哈希值,由查询sql、当前要查询的数据库、客户端协议版本等生成的,value就是查询结果。如果要绕过查询缓存,可以在sql中加sql_no_cache字段,如:

select sql_no_cache * from table

注:mysql8.0版本开始取消查询缓存

4、查询sql执行流程之解析器

解析器执行流程分为两个阶段,词法解析和语法解析

(1)首先对sql词法进行分析,将sql从左到右一个字符、一个字符地输入,然后根据构词规则识别单词。将会生成4个token,如下所示:

一条查询sql的执行流程和底层原理

(2)然后对sql语法进行解析,判断客户端传入的sql语句是否满足mysql语法。此时会生成一颗语法树,如下所示:

 一条查询sql的执行流程和底层原理

如果语法不对,将会收到如下提示

you have an error in your sql syntax

 

 如果解析器顺利生成语法树,就会将sql送发到预处理器

5、查询sql执行流程之预处理器

预处理器主要做两件事情,查看sql中列名是否正确和权限验证

(1)首先判断sql语句中的列名是否存在于数据表中,再看看表名是否正确,如果不对,将返回如下错误提示

 unknown column xxx inwhere clause’

 

(2)预处理器对sql进行权限验证,判断sql是否有操作这个表的权限,若没有,则会返回如下错误信息

error 1142 (42000): select command denied to user 'root'@'localhost' for table 'xxx'

 

 一切验证通过后将语法树传递给优化器

6、查询sql执行流程之优化器

优化器的任务就是对sql语句进行优化,达到最快的执行效果,优化器对sql优化完成后会将sql变成一个执行计划交给执行器

7、查询sql执行流程之执行器

执行器就是根据执行计划来进行执行查询, 根据sql的指令,逐条调用底层存储引擎,逐步执行。

mysql定义了一系列抽象存储引擎api,以支持插件式存储引擎架构。mysql实现了一个抽象接口层,叫做 handler(sql/handler.h),其中定义了接口函数,比如:ha_open, ha_index_end, ha_create等等,存储引擎需要实现这些接口才能被系统使用。

 

上一篇: mysql笔记

下一篇: awk练习笔记