Oracle 中的 SQL 执行逻辑

image.png

  1. 语法检查:检查 SQL 拼写
  2. 语义检查:检查 SQL 中的访问对象是否存在
  3. 权限检查
  4. 共享池检查

检查共享池是否存在 SQL 语句的执行计划,判断进行硬解析还是软解析。

  1. 共享池(Shared Pool):也就是一块内存池。用于缓存 SQL 语句和该语句的执行计划
  2. 执行计划:explain查看 SQL 语句的执行计划。EXPLAIN SELECT * FROM table;
  3. 软解析:对 SQL 进行 Hash 运算,根据 Hash 值在库缓存(Library Cache)中查找。存在该 SQL 语句的执行计划,直接执行。这就是软解析。
  4. 硬解析:进入优化器,即 创建解析树 -> 生成执行计划

为了提升 SQL 的执行效率,我们应该尽量避免硬解析,因为在 SQL 的执行过程中,创建解析树,生成执行计划是很消耗资源的。

如何避免硬解析,尽量使用软解析呢?在 Oracle 中,绑定变量是它的一大特色。绑定变量就是在 SQL 语句中使用变量,通过不同的变量取值来改变 SQL 的执行结果。这样做的好处是能提升软解析的可能性,不足之处在于可能会导致生成的执行计划不够优化,因此是否需要绑定变量还需要视情况而定。

  1. SQL> select * from player where player_id = 10001;

MySQL 中的 SQL 执行逻辑

MySQL 是典型的 C/S 架构,即 Client/Server 架构,服务器端程序使用的 mysqld。架构图如下:
image.png

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

    1. SQL 层结构

    image.png

  4. 查询缓存:Server 如果在查询缓存中发现了这条 SQL 语句,就会直接将结果返回给客户端;如果没有,就进入到解析器阶段。需要说明的是,因为查询缓存往往效率不高,所以在 MySQL8.0 之后就抛弃了这个功能。

  5. 解析器:在解析器中对 SQL 语句进行语法分析、语义分析
  6. 优化器:在优化器中会确定 SQL 语句的执行路径,比如是根据全表检索,还是根据索引来检索等。执行器:在执行之前需要判断该用户是否具备权限,如果具备权限就执行 SQL 查询并返回结果。在 MySQL8.0 以下的版本,如果设置了查询缓存,这时会将查询结果进行缓存。

SQL 语句在 MySQL 中的流程是:SQL 语句→缓存查询→解析器→优化器→执行器。

InnoDB存储引擎

MySQL 5.5 版本之后默认的存储引擎,最大的特点是支持事务、行级锁定、外键约束等。
行级锁定:每次锁定的是一行数据的锁机制

  1. -- 查看 @@profiling --
  2. mysql> select @@profiling
  3. -- 设置 --
  4. mysql> set profiling=1;
  5. -- 获取上一次的查询时间 --
  6. mysql> show profile;
  7. -- 查询指定 query ID --
  8. mysql> show profile for query 2;
  1. select version();

总结

image.png