SQL 必知必会
陈旸
清华大学计算机博士
73337 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 50 讲
第一章:SQL语法基础篇 (19讲)
SQL 必知必会
15
15
1.0x
00:00/00:00
登录|注册

03丨学会用数据库的方式思考SQL是如何执行的

总结
MySQL
Oracle
SQL执行原理

该思维导图由 AI 生成,仅供参考

通过上一篇文章对不同的 DBMS 的介绍,你应该对它们有了一些基础的了解。虽然 SQL 是声明式语言,我们可以像使用英语一样使用它,不过在 RDBMS(关系型数据库管理系统)中,SQL 的实现方式还是有差别的。今天我们就从数据库的角度来思考一下 SQL 是如何被执行的。
关于今天的内容,你会从以下几个方面进行学习:
Oracle 中的 SQL 是如何执行的,什么是硬解析和软解析;
MySQL 中的 SQL 是如何执行的,MySQL 的体系结构又是怎样的;
什么是存储引擎,MySQL 的存储引擎都有哪些?

Oracle 中的 SQL 是如何执行的

我们先来看下 SQL 在 Oracle 中的执行过程:
从上面这张图中可以看出,SQL 语句在 Oracle 中经历了以下的几个步骤。
语法检查:检查 SQL 拼写是否正确,如果不正确,Oracle 会报语法错误。
语义检查:检查 SQL 中的访问对象是否存在。比如我们在写 SELECT 语句的时候,列名写错了,系统就会提示错误。语法检查和语义检查的作用是保证 SQL 语句没有错误。
权限检查:看用户是否具备访问该数据的权限。
共享池检查:共享池(Shared Pool)是一块内存池,最主要的作用是缓存 SQL 语句和该语句的执行计划。Oracle 通过检查共享池是否存在 SQL 语句的执行计划,来判断进行软解析,还是硬解析。那软解析和硬解析又该怎么理解呢?
在共享池中,Oracle 首先对 SQL 语句进行 Hash 运算,然后根据 Hash 值在库缓存(Library Cache)中查找,如果存在 SQL 语句的执行计划,就直接拿来执行,直接进入“执行器”的环节,这就是软解析。
如果没有找到 SQL 语句和执行计划,Oracle 就需要创建解析树进行解析,生成执行计划,进入“优化器”这个步骤,这就是硬解析。
优化器:优化器中就是要进行硬解析,也就是决定怎么做,比如创建解析树,生成执行计划。
执行器:当有了解析树和执行计划之后,就知道了 SQL 该怎么被执行,这样就可以在执行器中执行语句了。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

SQL在Oracle和MySQL中的执行过程有着相似之处,但也存在一些显著差异。在Oracle中,SQL语句经历了语法检查、语义检查、权限检查、共享池检查、优化器和执行器等步骤。共享池的存在决定了SQL语句是否需要进行硬解析,而绑定变量可以减少硬解析的次数。而在MySQL中,SQL语句经历了连接层、SQL层和存储引擎层的处理,其中解析器、优化器和执行器的功能与Oracle类似。MySQL的存储引擎采用了插件的形式,每个存储引擎都面向一种特定的数据库应用环境。此外,MySQL的8.0版本后不再支持查询缓存,直接执行解析器→优化器→执行器的流程。读者通过本文可以快速了解SQL在不同数据库管理系统中的执行原理和特点,以及如何优化SQL的执行效率。 Oracle中的绑定变量可以减少SQL语句的硬解析次数,提高执行效率,但需要注意绑定变量的使用方式和管理。MySQL的存储引擎中,MyISAM适合读密集型应用,而InnoDB适合写密集型应用,读者可以根据具体需求选择合适的存储引擎。最后,解析后的SQL语句在Oracle中进行缓存的区域是共享池。通过本文的内容,读者可以全面了解SQL在Oracle和MySQL中的执行过程及相关特性,为数据库应用和优化提供了有益的参考。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《SQL 必知必会》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(113)

  • 最新
  • 精选
  • Frank
    置顶
    老师,那两张,oracle,mysql 的大图。是哪儿的。有没有高清的啊。很多小字看不清楚。能否给个高清的链接。

    编辑回复: 请您点击这里进行下载:https://github.com/cystanford/SQL-XMind

    2019-06-19
    2
    14
  • FATMAN89
    置顶
    老师讲的挺好的,想请问老师,课程所用到的数据库在哪里可以获得呢,多谢

    编辑回复: 第五篇文章会给出下载链接~

    2019-06-18
    10
  • 刘桢
    今年考研必上北京邮电大学!

    作者回复: 加油~ 没问题的

    2019-06-18
    13
    49
  • NO.9
    C,共享池。 讲的好系统啊,有种想学个花拳绣腿,结果教我九阳神功的感觉。

    作者回复: 很好 加油~

    2019-06-30
    15
  • 张驰皓
    感觉 MySQL 部分的第二张图(流程图)有点问题,“缓存查询”后“找到”分支的箭头应该不用再指向”缓存查询“吧?

    作者回复: 感谢认真提问,缓存查询后,如果找到了就直接输出结果。如果没有找到就执行 解析器=>优化器=>执行器的流程,然后可以将结果存储到 缓存中方便后续进行查询。所以箭头回向指的是这个

    2019-12-01
    13
  • qf年间
    文中多次提到执行计划,这是一个什么东西呢,可否具体讲解一下,或者举例说明

    作者回复: 最简单的方式,你可以使用explain来查看某一条SQL语句的执行计划,这样比较直观,比如 EXPLAIN SELECT * FROM player 你能看到在MySQL查询优化器中是如何执行SQL语句的

    2019-09-10
    8
  • allean
    共享池

    作者回复: 对的

    2019-06-17
    7
  • leslie
    再次听一遍不一样的东西还是会发现不一样的收货:这大概就是数据库用的多了有时代码层确实没啥 ,可是切换中的优化过程还是会疏漏某些分析细节。 explain已经用到了极致,忘了优化的极限其实是多种方式的相辅相成;profile早期用过,反而这几年用的很少很少;explain更加管用-在多种数据库中,反而忘了有时需要一些简单的手段辅以。

    作者回复: 加油~ 哈哈

    2019-06-17
    6
  • firstblood
    MyISAM 和InnoDB的比较参考https://www.jianshu.com/p/a957b18ba40d 这个文章

    作者回复: 多谢分享

    2019-09-25
    1
  • Geek_d3a509
    Oracle中绑定变量:SQL语句中相同的操作对不同的变量值用一个变量来代替,使得Oracle中要做硬解析变成软解析,以减少Oracle在解析上花费的时间 优点:减少了很多不必要的硬解析,将由软解析代替,大大降低数据库花费在SQL解析上的资源开销(时间与空间的浪费)。 缺点:绑定了变量之后优化比较困难,使用绑定之后可能对执行计划有一定的影响,导致执行计划的出错。比如很多重复的语句使用一个变量代替,那么可能就第一条解析正确,余下的就不能正确执行。 InnoDB的特性与使用场景(mysql5.5及以后版本默认存储引擎):事务型存储引擎,支持ACID特性;支持行级锁。适用大多数OLTP应用 MyISAM的特性与使用场景:不支持事务,表级锁。适用(1)非事务性应用 (2)只读型应用 (3)空间型应用 选择题选C

    作者回复: 正确 & Geek总结的不错

    2019-12-04
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部