sqlserver查询表是否存在的语句 sql数据库查询中,空值查询条件怎么写?
sql数据库查询中,空值查询条件怎么写?
在MSSQLServer和Oracl
mysql:一条SQL查询语句是如何执行的?
本文将分析下一条sql语句在Mysql中的执行过程,包括sql的查询将如何在Mysql内部流动,以及SQL语句的更新是如何完成的。
在分析之前,我先给大家展示一下MySQL的基础架构,了解一下MySQL由哪些组件组成,可以帮助我们理解和解决这些问题。
MySQL基础架构分析1.1 MySQL基础架构概述
下图是MySQL的简要架构图,从中可以清楚地看到用户 的SQL语句在MySQL内部执行。
让 下面我们简单介绍一下下图中涉及到的一些组件的基本功能,帮助你理解这个图,这些组件的功能将在1.2节详细介绍。
连接器:认证与权限相关(登录MySQL时)。查询缓存:在执行一条查询语句的时候,会先查询缓存(MySQL版以后去掉了,因为这个功能不是很实用)。如果解析器:不;如果没有命中缓存,SQL语句将通过解析器。说白了,解析器首先要看你的SQL语句是干什么用的,然后检查你的SQL语句的语法是否正确。优化器:按照MySQL认为最好的方案实现。执行器:执行该语句,然后从存储引擎返回数据。
简单来说,MySQL主要分为服务器层和存储引擎层:
服务器层:主要包括连接器、查询缓存、分析器、优化器、执行器等。跨存储引擎的所有功能都在这一层实现,比如存储过程、触发器、视图、函数等。还有一个通用的日志模块,binglog日志模块。存储引擎:主要负责数据存储和读取,采用可替换插件架构,支持InnoDB、MyISAM、Memory等多种存储引擎,其中InnoDB引擎自带日志模块redolog模块。现在最常用的存储引擎是InnoDB,从MySQL 5 . 5 . 5版开始,它就被视为默认的存储引擎。1.2服务器层基本组件介绍
1)连接器
连接器主要涉及与身份验证和权限相关的功能,就像高级门卫一样。
它主要负责用户登录数据库和用户认证。;的身份,包括检查账户密码、权限等操作。如果用户 的帐户密码已过,连接器将在权限表中查找该用户的所有权限,然后该连接中权限的逻辑判断将取决于此时读取的权限数据,也就是说,只要连接持续打开,即使管理员修改了用户 的权限。
2)查询缓存(MySQL版后移除)
查询缓存主要用于缓存我们执行的SELECT语句以及该语句的结果集。
连接建立后,执行查询语句时,会先查询缓存。Mysql会先检查这条sql是否已经执行,并以Key-Value的形式缓存在内存中,其中Key是查询预期,Value是结果集。如果命中缓存键,将直接返回给客户端。如果未命中,则执行后续操作,完成后缓存结果,方便下次调用。当然,当实际执行缓存查询时,用户 的权限,以及该表是否有查询条件。
不建议对MySQL查询使用缓存,因为在实际的业务场景中,查询缓存失效可能会非常频繁。如果更新一个表,该表上的所有查询缓存都将被清空。对于不经常更新的数据,仍然可以使用缓存。
因此,在大多数情况下,我们一般不 不建议使用查询缓存。
MySQL版之后,删除了缓存功能,官方认为实际应用场景中该功能较少,所以干脆删除了。
3)分析仪
如果MySQL不 t命中缓存,就会进入分析器,分析器主要用来分析SQL语句是干什么用的,分析器会分为几个步骤:
第一步,词法分析,一条SQL语句由多个字符串组成。首先,需要提取关键字,比如select、引发查询的表、字段名、查询条件等等。完成这些操作后,你将进入第二步。
第二步,语法分析,主要是判断你输入的sql是否正确,是否符合MySQL的语法。
完成这两步,MySQL就准备开始执行了,但是怎么执行,怎么执行才是最好的结果?这时候优化器就需要发挥作用了。
4)优化器
优化器的作用是它认为最优的执行方案被实现(有时可能不是最优的,本文涉及到这部分知识的深入讲解),比如使用多个索引时如何选择索引,如何查询多个表。何时以及如何选择关联顺序等。
可以说优化器之后,可以说如何执行这个语句已经决定了。
5)致动器
当执行方案选定后,MySQL就准备开始执行了。首先,在执行之前,它会检查用户是否有权限。否则,它将返回一条错误消息。如果有权限,它会调用引擎的接口,返回接口执行的结果。
两句话分析2.1查询语句
说到这里,一条sql语句到底是怎么执行的呢?其实我们的sql可以分为两种,一种是查询,一种是更新(添加、更新、删除)。让 让我们首先分析查询语句。声明如下:
Select * from tb_student A where和张三
结合上面的描述,我们分析一下这条语句的执行过程:
首先,检查语句是否有权限。如果没有,直接返回错误信息。如果有,在Mysql8.0版本之前,先查询缓存,以此sql语句为关键字查询内存中是否有结果。如果有直接缓存,如果没有,执行下一步。由分析器进行词法分析,提取sql语句的关键元素,比如提取上面的语句是query select,提取要查询的表名为tb_student,需要查询所有列,查询条件为该表的id1。然后判断这条sql语句是否存在语法错误,比如关键词是否正确等。如果没有问题,执行下一步。接下来,优化器确定执行方案。上面的sql语句可以有两种执行方案:
A.首先检查名为 "张三 "在学生表中,然后判断年龄是否为18岁。首先找出18岁的学生,然后查询名字是 "张三 "。
然后优化器根据自己的优化算法选择最高效的方案(优化器认为有时候不一定是最好的)。然后确认执行计划后,就准备开始执行了。
检查权限。如果没有权限,将返回一条错误消息。如果有权限,会调用数据库引擎接口,返回引擎的执行结果。
2.2更新声明
以上是查询sql的一个执行过程,所以让 让我们看看update语句是如何执行的。sql语句如下所示:
更新tb _学生一集张三在哪里
让 s修改张三 年代。实际数据库中肯定不会设置年龄字段,否则由技术负责人键入。其实这个语句基本会遵循上一次查询的流程,只是更新时必须记录日志,这就要介绍日志模块,MySQL 自己的日志模块binlog(归档日志)和所有存储引擎。可以使用,我们常用的InnoDB引擎还自带了一个日志模块redo log(重做日志),所以我们将在InnoDB模式下讨论这条语句的执行过程。流程如下:
先查询张三的数据。如果有缓存,也会使用它。然后获取查询语句,把年龄改成19,然后调用引擎的API接口写这一行数据。InnoDB引擎将数据保存在内存中,并记录重做日志。此时重做日志进入准备状态,然后告诉执行人执行完成,可以随时提交。收到通知后,执行器记录binlog,然后调用引擎接口,提交重做日志作为提交状态。更新完成。这里肯定有同学会问,为什么要用两个日志模块,而不是一个日志模块?
这是因为MySQL没有 t一开始用InnoDB engine(InnoDB engine是其他公司作为插件插入MySQL的),MySQL 的引擎是MyISAM,但是我们知道重做日志是InnoDB引擎独有的,其他存储引擎都没有。这样一来,就不会有崩溃安全的能力(即使数据库非正常重启,之前提交的记录也不会丢失),binlog日志只能用于存档。
It 不是那样的。;不可能只使用一个日志模块,但是InnoDB引擎支持通过重做日志处理事务。然后,有些同学会问,我用两个日志模块,但是可以 不会这么复杂吧?为什么重做日志引入了准备提交前状态?这里我们用归谬法来解释为什么要这样做。
先写重做日志直接提交,再写binlog。假设写完重做日志后,机器挂起,binlog日志没有写,那么机器重启后,机器会通过重做日志恢复数据,但此时binlog没有记录数据,所以后面备份机器时会丢失,同时主从同步也会丢失这些数据。首先写binlog,然后重做log。假设写完binlog后,机器异常重启。因为没有重做日志,所以这台机器无法恢复这个记录,但是binlog有一个记录。然后和上面一样,会出现数据不一致的情况。如果重做日志分两个阶段提交,会有所不同。编写binglog后,提交Redlog会防止上述问题,从而保证数据的一致性。那么问题来了。嗯,有没有极端的情况?假设重做日志处于提交前状态,binglog已经完成。如果此时出现异常重启会怎么样?这取决于MySQL的处理机制,MySQL的处理过程如下:
判断重做日志是否完整,如果完整,立即提交。如果重做日志只是预提交,而不是提交状态,此时会判断binlog是否完整,如果完整就提交重做日志,如果不完整就回滚事务。这就解决了数据一致性的问题。
第三,MySQL主要分为服务器层和引擎层。服务器层主要包括连接器、查询缓存、分析器、优化器和执行器,还有一个日志模块(binlog),所有执行引擎都可以共享,redolog只有InnoDB才有。引擎层是插件,主要包括MyISAM、InnoDB、Memory等等。查询语句的执行流程如下:权限检查(如果命中缓存)-查询缓存-分析器-优化器-权限检查-执行器。引擎更新语句的执行流程如下:分析器-权限检查-执行器。
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。