SQL是如何执行得

Oracle中SQL的执行

硬解析,软解析
SQL语句在Oracle中执行的过程

请添加图片描述

1.语法检查:SQL拼写是否正确(语法错误)
2.语义检查:SQL中访问对象是否存在,比如检查一个不存在的列。以上都是为了保证SQL语句不出现错误
3.权限检查:查看用户是否具备访问该数据的权限
4.共享池检查:共享池(SharePool)是一块内存池,用来缓存SQL语句和该语句的执行计划。Oracle通过检查共享池是否存在SQL语句的执行计划来判断进行软解析还是硬解析。共享池中Oracle首先对SQL语句进行Hash运算,然后根据Hash在库缓存(Library Cache)中查找,如果有执行计划,直接执行,进入执行器环节,软解析结束。如果没有找到SQL语句和执行计划,Oracle就会创建解析树进行解析,生成执行计划,进入优化器,进行硬解析。
5.优化器:优化器中就是要进行硬解析,决定怎么做,创建解析树,生成执行计划。
6.执行器:有了解析树和执行计划之后,就知道了SQL该怎么执行,这样就可以在执行器中执行语句了。

Oracle中的共享池(避免硬解析)

共享池是Oracle中的术语
1.库缓存	缓存SQL语句和执行计划
2.数据字典缓冲区 缓存Oracle中的对象那个定义,表,视图,索引等。当对SQL语句进行解析的时候,需要相关数据就会从字典缓冲区中提取。

库缓存决定了SQL语句是否需要进行硬解析,为了提升SQL的执行效率,应该尽量避免硬解析,SQL执行中,创建解析树,生成执行计划是很消耗资源的。

使用绑定变量可以避免硬解析,尽量使用软解析。绑定变量是在SQL语句中使用变量,通过不同的变量取值来改变SQL的执行结果,**提升了软解析的可能性,但可能会导致生成的计划不够优化,绑定变量三思**
## 不使用绑定变量
SELECT * FROM player where player_id = 10001
## 使用绑定变量
SELECT * FROM palyer where player_id = :player_id
在Oracle中 两者查询效率不同
如果查询player_id=10001之后,还会查询10002,10003之类,每个查询都要新建查询解析。第二种方式采用了绑定变量,第一次查询后,共享池库缓存就会存在存在这类查询的执行计划,也就是软解析。
可以通过**使用绑定变量来减少硬解析,减少Oracle解析工作量**。缺点:**使用动态SQL的方式,因为参数不同,会导致SQL的执行效率不同,同时SQL的优化也会比较困难。**

MySQL中SQL的执行

Oracle采用了共享池判断SQL语句是否存在缓存和执行计划,通过这一步骤,分辨软硬解析。

MySQL 典型C/S结构,服务端是mysqld

请添加图片描述

1.连接层:客户端和服务器建立连接,客户端发送SQL至服务器端
2.SQL层:对SQL语句进行查询处理
3.存储引擎层:和数据库文件交流,负责数据的存储和读取

请添加图片描述

SQL的主要事务
1.查询缓存:Server 如果在查询缓存中发现了这条 SQL 语句,就会直接将结果返回给客户端;如果没有,就进入到解析器阶段。需要说明的是,因为查询缓存往往效率不高,所以在 MySQL8.0 之后就抛弃了这个功能。
2.解析器:在解析器中对 SQL 语句进行语法分析、语义分析。
3.优化器:在优化器中会确定 SQL 语句的执行路径,比如是根据全表检索,还是根据索引来检索等。
4.执行器:在执行之前需要判断该用户是否具备权限,如果具备权限就执行 SQL 查询并返回结果。在 MySQL8.0 以下的版本,如果设置了查询缓存,这时会将查询结果进行缓存。

存储引擎

MySQL存储引擎采用了插件的形式,每个存储引擎都面向适合的数据库应用环境。还允许开发人员设置自己的存储引擎。

InnoDB 存储引擎:它是 MySQL 5.5 版本之后默认的存储引擎,最大的特点是支持事务、行级锁定、外键约束等。
MyISAM 存储引擎:在 MySQL 5.5 版本之前是默认的存储引擎,不支持事务,也不支持外键,最大的特点是速度快,占用资源少。
Memory 存储引擎:使用系统内存作为存储介质,以便得到更快的响应速度。不过如果 mysqld 进程崩溃,则会导致所有的数据丢失,因此我们只有当数据是临时的情况下才使用 Memory 存储引擎。
NDB 存储引擎:也叫做 NDB Cluster 存储引擎,主要用于 MySQL Cluster 分布式集群环境,类似于 Oracle 的 RAC 集群。
Archive 存储引擎:它有很好的压缩机制,用于文件归档,在请求写入时会进行压缩,所以也经常用来做仓库
**数据库的设计在于表的设计,而在 MySQL 中每个表的设计都可以采用不同的存储引擎,我们可以根据实际的数据处理需要来选择存储引擎**

对MySQL语句性能分析

在不同的模块中,SQL 执行所使用的资源(时间)是怎样的,对SQL语句的执行时间进行分析。

1.观察profiling开启状态,手机MySQL执行时所使用的资源情况select @@profiling
=0代表关闭,=1代表打开
2.打开profiling set profiling = 1
3.执行SQL查询 select * from table
4.查看当前会话产生的所有profiles show profiles
5.获取上一次查询的执行时间 show profile
观察事物和时间 排查问题 
6.查询指定语句QueryID show profile for query 2

为什么MySQL删除了查询缓存

一旦数据表有更新,缓存都将清空,因此只有数据表是静态的时候,或者数据表很少发生变化时,使用缓存查询才有价值,否则如果数据表经常更新,反而增加了 SQL 的查询时间。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值