一条SQL查询语句是如何执行的?

         导读           mysql

Mysql在中小型企业中是个香饽饽,目前主流的数据库之一,几乎没有一个后端开发者不会使用的,可是做为一个老司机,仅仅会用真的不够。算法

今天陈某透过一个简单的查询语句来说述在Mysql内部的执行过程。sql

select * from table where id=10;

        撸它        数据库

首先经过一张图片来了解一下Mysql的基础架构,以下:后端

从上图能够看出,Mysql大体分为Server层存储引擎层两部分。缓存

Server层包括链接器查询缓存分析器优化器等,其中包含了Mysql的大多数核心功能以及全部的内置函数(如日期,时间函数等),全部跨存储引擎的功能都在这一层实现,好比存储过程触发器视图等。架构

存储引擎层负责数据的存储和提取。它的架构是可插拔式的,支持InnoDB、MyISAM等多个存储引擎。Mysql中主流的存储引擎是InnoDB,因为它对事务的支持让它从Mysql5.5.5版本开始成为了默认的存储引擎ide

大体了解了总体架构,如今说说每个基础的模块都承担着怎样的责任。函数

1. 链接器优化

顾名思义,是客户端和Mysql之间链接的媒介,负责登陆获取权限维持链接管理链接。链接命令通常以下:

mysql [-h] ip [- P] port -u [user] -p

在完成经典的TCP握手后,链接器会开始认证身份,要求输入密码。

  1.  密码认证经过,链接器会查询出拥有的权限,即便管理员修改了权限,也不会影响你此次的链接,只有从新链接才会生效。

  2. 密码认证失败,会收到提示信息Access denied for user

链接完成后,没有后续动做的链接将会变成空闲链接,你能够输入show processlist命令看到它。以下图,其中的Command这一列显示为sleep的这一行表示在系统里面有一个空闲链接。

客户端若是太长时间没有执行动做,链接器将会自动断开,这个时间由参数wait_timeout控制,默认值是8小时。

若是在链接被断开以后,客户端再次发送请求的话,就会收到一个错误提醒:Lost connection to MySQL server during query。这时候若是你要继续,就须要重连,而后再执行请求了。

2. 查询缓存【废材,8.0 版本彻底删除】

链接创建完成后,你就能够select语句了,执行以前会查询缓存。

查询缓存在Mysql中的是默认关闭的,由于缓存命中率很是低,只要有对表执行一个更新操做,这个表的全部查询缓存都将被清空。怎么样?一句废材足以形容了!!!

废材的东西没必要多讲,主流的Redis的缓存你不用,别再搞这废材了。

3. 分析器

若是没有命中查询缓存,就要执行查询了,可是在执行查询以前,须要对SQL语句作解析,判断你这条语句有没有语法错误。

分析器会作 '词法分析' ,你输入的无非可就是多个字符串和空格组成的SQL语句,MYSQL须要识别出里面的字符串是什么,表明什么,有没有关键词等。

MYSQL会从你输入的select 这个关键字识别出来是一个查询语句,table是表名,id是列名。

作完这些会作 '语法分析' ,根据MYSQL定义的规则来判断你的SQL语句有没有语法错误,若是你的语法不对,就会收到相似以下的提醒:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'elect * from t where ID=1' at line 1

通常语法错误会提示第一个出现错误的位置,因此你要关注的是紧接“use near”的内容。

4. 优化器

通过分析器词法和语法的分析,此时就能知道这条SQL语句是干什么的。可是在开始执行以前,MYSQL底层还要使用优化器对这条SQL语句进行优化处理。

MYSQL内部会对这条SQL进行评估,好比涉及到多个索引会比较使用哪一个索引代价更小、多表join的时候会考虑决定各个表的链接顺序。

优化器的做用一句话总结:根据MYSQL内部的算法决定如何执行这条SQL语句来达到MYSQL认为代价最小目的。

优化器阶段完成后,这个语句的执行方案就肯定了,接下来就交给执行器执行了。

5. 执行器

MYSQL经过分析器知道了要作什么,经过优化器知道了如何作,因而就进入了执行器阶段。

执行器开始执行以前,须要检查一下用户对表table有没有执行的权限,没有返回权限不足的错误,有的话就执行。

执行也是分类的,若是Id不是索引则全表扫描,一行一行的查找,若是是索引则在索引组织表中查询,索引的查询很复杂,其中涉及到B+树等算法,这里再也不详细介绍。

        总结        

一条SQL语句在MYSQL内部执行的过程涉及到的内部模块有:链接器查询缓存分析器优化器执行器存储引擎

至此MYSQL的基础架构已经介绍完了,若是你以为陈某写的还能够,对你有所帮助的话,给个在看,分享一波,谢谢!!!

留言