Oracle 中的 SQL 执行逻辑
- 语法检查:检查 SQL 拼写
- 语义检查:检查 SQL 中的访问对象是否存在
- 权限检查
- 共享池检查
检查共享池是否存在 SQL 语句的执行计划,判断进行硬解析还是软解析。
- 共享池(Shared Pool):也就是一块内存池。用于缓存 SQL 语句和该语句的执行计划
- 执行计划:
explain
查看 SQL 语句的执行计划。EXPLAIN SELECT * FROM table;
- 软解析:对 SQL 进行 Hash 运算,根据 Hash 值在库缓存(Library Cache)中查找。存在该 SQL 语句的执行计划,直接执行。这就是软解析。
- 硬解析:进入优化器,即 创建解析树 -> 生成执行计划
为了提升 SQL 的执行效率,我们应该尽量避免硬解析,因为在 SQL 的执行过程中,创建解析树,生成执行计划是很消耗资源的。
如何避免硬解析,尽量使用软解析呢?在 Oracle 中,绑定变量是它的一大特色。绑定变量就是在 SQL 语句中使用变量,通过不同的变量取值来改变 SQL 的执行结果。这样做的好处是能提升软解析的可能性,不足之处在于可能会导致生成的执行计划不够优化,因此是否需要绑定变量还需要视情况而定。
SQL> select * from player where player_id = 10001;
MySQL 中的 SQL 执行逻辑
MySQL 是典型的 C/S 架构,即 Client/Server 架构,服务器端程序使用的 mysqld。架构图如下:
- 连接层:客户端和服务器端建立连接,客户端发送 SQL 至服务器端;
- SQL 层:对 SQL 语句进行查询处理;
-
1. SQL 层结构
查询缓存:Server 如果在查询缓存中发现了这条 SQL 语句,就会直接将结果返回给客户端;如果没有,就进入到解析器阶段。需要说明的是,因为查询缓存往往效率不高,所以在 MySQL8.0 之后就抛弃了这个功能。
- 解析器:在解析器中对 SQL 语句进行语法分析、语义分析。
- 优化器:在优化器中会确定 SQL 语句的执行路径,比如是根据全表检索,还是根据索引来检索等。执行器:在执行之前需要判断该用户是否具备权限,如果具备权限就执行 SQL 查询并返回结果。在 MySQL8.0 以下的版本,如果设置了查询缓存,这时会将查询结果进行缓存。
SQL 语句在 MySQL 中的流程是:SQL 语句→缓存查询→解析器→优化器→执行器。
InnoDB存储引擎
MySQL 5.5 版本之后默认的存储引擎,最大的特点是支持事务、行级锁定、外键约束等。
行级锁定:每次锁定的是一行数据的锁机制
-- 查看 @@profiling --
mysql> select @@profiling
-- 设置 --
mysql> set profiling=1;
-- 获取上一次的查询时间 --
mysql> show profile;
-- 查询指定 query ID --
mysql> show profile for query 2;
select version();