当前位置:   article > 正文

数据库系列1:SQL查询语句的执行过程_一个sql语句的检索过程

一个sql语句的检索过程

当我们通过终端或者其他方式连接到数据库进行SQL操作时,整个过程是怎么样的呢?理解该过程有利于了解Mysql的架构和优化方法,我们就来看一下。

1.执行过程

执行整体过程如下所示:
在这里插入图片描述
具体来说有以下步骤:

1.1.建立连接

Mysql服务监听的默认端口是3306,客户端可以采用多种方式连接服务端。可以是同步的,也可以是异步的,可以是长连接也可以是短连接,可以是TCP也可以是Socket。如果想看当前Mysql有多少个连接,可以使用如下的命令:

show status like 'Thread%';
  • 1

例如我的本机当前的连接情况为:
在这里插入图片描述

为什么查看线程就是查看连接数呢?
这是因为客户端每产生一个连接,就开辟一个线程来处理。这也意味着长时间不活动的线程可能被断开。
Mysql内部使用了两个变量交互式和非交互式超时时间,前者如数据库工具等,后者如JDBC程序等。查看命令分别为:

show global variables like 'interactive_timeout';
show global variables like 'wait_timeout'; 
  • 1
  • 2

从下图可以看到,默认的时间是28800s,也就是8小时。
在这里插入图片描述

如果要看最大连接数量,可以使用这个命令:

show variables like 'max_connections';
  • 1

在这里插入图片描述

可以看到默认是151个,最大可以设置成100000。

Mysql中的参数分为session和global两个级别,分别是当前会话中生效和全局生效。但不是每个参数都有两个级别,比如,上面的max_connections就只有全局级别。没有带参数的时候,默认就是session级别,包括查询和修改,比如修改了一个参数以后,在本窗口查询应生效,但是在其他窗口就不生效。
所以如果只是临时修改,使用session级别就行了,如果需要在其他会话中生效,必须显式加上global参数。

1.2.查询缓存

mysql内部自带一个缓存,如果两次执行一模一样的查询时,会更快一些,但是适用场景非常有限的,要求查询完全一样,记录也不能变化,这不如直接交给redis或者Mybatis的一级缓存来进行。
因此该功能默认是关闭的,Mysql8里取消了该模块。

1.3.语法解析和预处理

这一部分内容是编译原理的重点,同时在自然语言处理,文本分析等领域也是核心的内容之一。
词法分析:将一个完整的SQL拆分成一个个独立的单词。
语法分析:对SQL进行语法检查,然后根据Mysql的语法规则,根据SQL语句生成一个解析树。
预处理器:检查生成的解析树,解决解析器无法解析的语义,例如检查表名和列名是否存在,是否有歧义等。预处理之后得到一个新的解析树。

1.4.查询优化和查询执行计划

一条语句是不是只有一种执行方式呢?不是的,查询优化器会根据解析树生成不同的执行计划,然后选择一种最优的执行计划。Mysql里面使用的是基于开销的优化器,哪种开销小,就用哪种。
优化器能解决的典型问题有;
1.对多个表进行关联查询的时候,以哪个表的数据作为基准表。
2.有多个索引可以使用时,选择哪个索引。
如果想看执行情况可以使用explain来查看,这个在后面整理索引问题时完整整理
例如:

explain select * from  tbl_employee;
explain  format=json select * from  tbl_employee; --查看更详细的信息
  • 1
  • 2

1.5.存储引擎

想看数据库文件存在哪里的,可以使用这个命令:

show variables like 'datadir';
  • 1

例如我的是:
在这里插入图片描述

这里仅仅看到了目录,存储引擎主要解决的问题更多:
1.从逻辑的角度来说 我们的数据怎么放?如何实现增删改查?
2.执行计划怎么执行,谁来执行。

Mysql的数据库引擎有Innodb,MyISAM等,这些可以在创建表的时候通过engine字段来指定。例如:

create table `payment`(
`id` bigint(20) not null   Auto_increment comment 'ID',
`serial` varchar(200) default '',
primary key(`id`)
)engine=InnoDB   Auto_increment=1 default charset=utf8;
  • 1
  • 2
  • 3
  • 4
  • 5

如果不设置,Mysql5.5之后默认使用的是InnoDB。

1.5.1 几种引擎的比较

在这里插入图片描述

1.5.2 如何选择合适的引擎?

如果对数据一致性要求比较高,需要事务支持,可以选择InnoDB。
如果数据查询多更新少,对查询性能要求比较高,可以选择MyISAM。
如果需要一个用于查询的临时表,可以选择memery.

1.6 执行引擎执行查询返回结果

存储引擎分析完之后,执行引擎利用存储引擎提供的API来完成操作。Mysql为不同的引擎提供了统一的API接口,所以换了引擎之后不需要做任何改变。
最后将结果封装起来返回给客户端。

2. 总结

总体上,我们可以把Mysql分为三层:跟客户端对接的连接层,执行操作的服务层和跟硬件打交道的存储引擎层。
连接层:客户端通过3306跟服务端建立连接,这里涉及到所有连接的管理,身份检验和权限管理等都在连接层完成。
服务层:主要功能是处理SQL语句和优化等,之后交给执行器去执行。
存储引擎:我们真正存放数据的地方,在Mysql里面支持不同的存储引擎,再往下就是内存或者磁盘。
在数据库里面只有查询和更新两个两发,没有我们常用的delete和insert方法,这是因为除了查询,其他三种本质上是一样的。

查询语句的执行过程说完了,那更新语句也是这样吗?肯定不是,因为会发生冲突,还需要调整索引等,因此更为复杂,下一篇我们来看。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/168658
推荐阅读
相关标签
  

闽ICP备14008679号