2019-11-10 我想让自己每天过的开心一些

2019-11-11  本文已影响0人  勒昂浪

我想借简书记录下我生活让我觉得还有点意义的每一刻。

SQL必知必会读书笔记(11:00 - 15:30)

SQL基础语法篇

SQL的学习阶段:SQL基础语法、SQL性能优化、主流数据库的使用和实践

为了可读性,约定的两个规范(SQL对大小写的区分因不同的数据库系统而异):

几个概念:

关于SQL和NoSQL

SQL在Oracle的执行过程


SQL在ORACLE中的执行过程.png

以下引用自极客时间 https://time.geekbang.org/column/article/101104

1.语法检查:检查 SQL 拼写是否正确,如果不正确,Oracle 会报语法错误。

  1. 语义检查:检查 SQL 中的访问对象是否存在。比如我们在写 SELECT 语句的时候,列名写错了,系统就会提示错误。语法检查和语义检查的作用是保证 SQL 语句没有错误。
  2. 权限检查:看用户是否具备访问该数据的权限。
  3. 共享池检查:共享池(Shared Pool)是一块内存池,最主要的作用是缓存 SQL 语句和该语句的执行计划。Oracle 通过检查共享池是否存在 SQL 语句的执行计划,来判断进行软解析,还是硬解析。那软解析和硬解析又该怎么理解呢?在共享池中,Oracle 首先对 SQL 语句进行 Hash 运算,然后根据 Hash 值在库缓存(Library Cache)中查找,如果存在 SQL 语句的执行计划,就直接拿来执行,直接进入“执行器”的环节,这就是软解析。如果没有找到 SQL 语句和执行计划,Oracle 就需要创建解析树进行解析,生成执行计划,进入“优化器”这个步骤,这就是硬解析。
  4. 优化器:优化器中就是要进行硬解析,也就是决定怎么做,比如创建解析树,生成执行计划。
  5. 执行器:当有了解析树和执行计划之后,就知道了 SQL 该怎么被执行,这样就可以在执行器中执行语句了。

SQL在MySQL中的执行过程


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

如何在 MySQL 中对一条 SQL 语句的执行时间进行分析

首先我们需要看下 profiling 是否开启,开启它可以让 MySQL 收集在 SQL 执行时所使用的资源情况

mysql> select @@profiling;

profiling=0 代表关闭,我们需要把 profiling 打开,即设置为 1:

mysql> set profiling=1;

然后我们执行一个 SQL 查询(你可以执行任何一个 SQL 查询):

mysql> select * from wucai.heros;

查看当前会话所产生的所有 profiles:


show Profiles.png

你会发现我们刚才执行了两次查询,Query ID 分别为 1 和 2。如果我们想要获取上一次查询的执行时间,可以使用:

mysql> show profile;

当然你也可以查询指定的 Query ID,比如:

mysql> show profile for query 2;

结果相同,如下:


show profile.png
注:以上图片均来自极客时间 《SQL必知必会》

刚开始学自由泳好嗨(16:30 - 18:00)

上一篇 下一篇

猜你喜欢

热点阅读