SQL的小知识(一)

sql在orcal中的执行过程:

1. 语法检查:检查sql拼写是否正确

2.语义检查:检查sql访问对象是否存在(如列名不存在,会报错)

3.权限检查:检查用户是否具备访问该数据库的权限

4.共享池检查(shared pool)是一块内存池,其主要作用是缓存sql语句和执行计划。orcal通过检查共享池来判断是进行软解析和硬解析。软解析:指orcal首先对sql语句进行hash运算,然后根据hash值来查找,如果存在sql语句的执行计划,就直接拿来执行,直接进入执行器的缓解,这就是软解析。如果没有找到sql语句和执行计划,orcal就要创建解析树进行解析,生成执行计划,进入优化器这个环节,这就是硬解析。

5.优化器:优化器中就是要进行硬解析,也就是决定怎么做,比如说创建解析树,生成执行计划。

6.当有了解析树和执行计划之后,就知道了sql语句该怎么执行,这样就可以在执行器中执行语句了。

ps:共享池是orcal中的术语。包括了库缓存,数据字典缓冲区等。库缓存区主要缓存了sql语句和执行计划,而数据字典缓冲区存储的是orcal中的对象定义,如表,视图,索引,等,当对sql语句进行解析的时候,如果需要相关的数据,会从数据字典缓冲区中提取。

优化的关键:库缓存。库缓存决定了sql语句是否需要进行硬解析,为了效率,应该避免硬解析,创建解析数,生成执行计划是非常消耗资源的。

如何避免硬解析,尽量使用软解析:

1.绑定变量:在sql中使用变量,通过不同的变量取值来改变sql的执行结果。这样能提升软解析的可能性,不足之处在于会导致生成的执行计划不够优化。

未绑定变量:

select * from student where id = '1001';

绑定变量:

select * from student where id = :player_id;

绑定变量以后第一次查询以后在共享池中就会存在这类查询的执行计划,也就是软解析

否则每次查询都回去创建一个新的查询解析。因此我们可以通过绑定变量来减少硬解析,解析orcal的解析工作量。但是这种动态的sql,因为参数不同,会导致sql的执行效率不同,同时sql优化也会比较困难。

Mysql中的sql是如何执行的

Mysql有三层

连接层:客户与服务器建立连接

sql层:对sql语句进行查询处理

存储引擎层:与数据库文件打交道,负责数据的存储和读取。

sql层的结构:

                                           sql语句

缓存                        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​   解析器

                                                                                           优化器

                                                                                           执行器

                                              结果


1先查缓存,有就直接返回,没有就进入解析器阶段、

2.解析器:对sql语句进行语法语义分析

3.优化器:在优化器会确定sql语句的执行路径,比如是根据全表检索,还是根据索引检索

4.执行器:在执行钱需要判断用户是否具备权限,如果具备权限就执行查询,并返回结果。在mysql8.0一下的版本,如果设置了查询缓存,就将查询结果进行缓存。

Mysql的存储引擎:

INNODB:支持事务,行级锁定,外键约束

MyISAM:不支持事务,不支持外键,但是速度快,占用资源少

Memory:使用系统内存作为储存介质,以便得到更快的响应速度,不过如果进程崩溃,回到值所有数据丢失,因此我们只有当数据是临时的情况下才是用|Memory存储引擎。

NDB存储引擎:也叫NDB Cluster存储引擎,主要用于Mysql Cluster分布式集群环境,类似于Orcal的RAC集群

Archive存储引擎:它有很好的压缩机织,用于文件归档,在请求写入是会进行压缩,所以夜京城用来做仓库。

查询profiling是否开启;0代表关闭,1代表打开

select @@profiling;


#打开
set profiling  =1;


#获取上一次的查询的执行时间
show profile;


#查询指定的QueryID
show profile for query 2;


#查询数据库版本
select version();

你可能感兴趣的:(sql,数据库,database)