SQL必知必会
陈旸
清华大学计算机博士
立即订阅
10179 人已学习
课程目录
已完结 49 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词丨SQL可能是你掌握的最有用的技能
免费
第一章:SQL语法基础篇 (19讲)
01丨了解SQL:一门半衰期很长的语言
02丨DBMS的前世今生
03丨学会用数据库的方式思考SQL是如何执行的
04丨使用DDL创建数据库&数据表时需要注意什么?
05丨检索数据:你还在SELECT * 么?
06丨数据过滤:SQL数据过滤都有哪些方法?
07丨什么是SQL函数?为什么使用SQL函数可能会带来问题?
08丨什么是SQL的聚集函数,如何利用它们汇总表的数据?
09丨子查询:子查询的种类都有哪些,如何提高子查询的性能?
10丨常用的SQL标准有哪些,在SQL92中是如何使用连接的?
11丨SQL99是如何使用连接的,与SQL92的区别是什么?
12丨视图在SQL中的作用是什么,它是怎样工作的?
13丨什么是存储过程,在实际项目中用得多么?
14丨什么是事务处理,如何使用COMMIT和ROLLBACK进行操作?
15丨初识事务隔离:隔离的级别有哪些,它们都解决了哪些异常问题?
16丨游标:当我们需要逐条处理数据时,该怎么做?
17丨如何使用Python操作MySQL?
18丨SQLAlchemy:如何使用Python ORM框架来操作MySQL?
19丨基础篇总结:如何理解查询优化、通配符以及存储过程?
第二章:SQL性能优化篇 (18讲)
20丨当我们思考数据库调优的时候,都有哪些维度可以选择?
21丨范式设计:数据表的范式有哪些,3NF指的是什么?
22丨反范式设计:3NF有什么不足,为什么有时候需要反范式设计?
23丨索引的概览:用还是不用索引,这是一个问题
24丨索引的原理:我们为什么用B+树来做索引?
25丨Hash索引的底层原理是什么?
26丨索引的使用原则:如何通过索引让SQL查询效率最大化?
27丨从数据页的角度理解B+树查询
28丨从磁盘I/O的角度理解SQL查询的成本
29丨为什么没有理想的索引?
30丨锁:悲观锁和乐观锁是什么?
31丨为什么大部分RDBMS都会支持MVCC?
32丨查询优化器是如何工作的?
33丨如何使用性能分析工具定位SQL执行慢的原因?
34丨答疑篇:关于索引以及缓冲池的一些解惑
35丨数据库主从同步的作用是什么,如何解决数据不一致问题?
36丨数据库没有备份,没有使用Binlog的情况下,如何恢复数据?
37丨SQL注入:你的SQL是如何被注入的?
第三章:认识DBMS (7讲)
38丨如何在Excel中使用SQL语言?
39丨WebSQL:如何在H5中存储一个本地数据库?
40丨SQLite:为什么微信用SQLite存储聊天记录?
41丨初识Redis:Redis为什么会这么快?
42丨如何使用Redis来实现多用户抢票问题
43丨如何使用Redis搭建玩家排行榜?
44丨DBMS篇总结和答疑:用SQLite做词云
第四章:SQL项目实战 (3讲)
45丨数据清洗:如何使用SQL对数据进行清洗?
46丨数据集成:如何对各种数据库进行集成和转换?
47丨如何利用SQL对零售数据进行分析?
结束语 (1讲)
结束语 | 互联网的下半场是数据驱动的时代
SQL必知必会
登录|注册

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

陈旸 2019-06-17
通过上一篇文章对不同的 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/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《SQL必知必会》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(76)

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

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

    2019-06-18
    3
  • we 置顶
    老师,那两张,oracle,mysql 的大图。是哪儿的。有没有高清的啊。很多小字看不清楚。能否给个高清的链接。

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

    2019-06-19
    2
  • KaitoShy
    1. 绑定变量概念:sql语句中使用变量,通过不同的变量值来改变sql的执行结果
    优点:减少硬解析,减少Oracle的工作量
    缺点:参数不同导致执行效率不同,优化比较难做。
    2.MyISAM的使用场景为读写分离的读库, 而InnoDB为写库
    3. C共享池,看图中有个Shared SQL Area。
    2019-06-17
    44
  • Zain Lau
    今年考研必上北京邮电大学!
    2019-06-18
    8
    36
  • 墨禾
    【回答3个问题】
    1、oracle中的绑定变量指的是 sql语句在执行时,通过改变不同的变量值来改变sql的执行结果;
    优点:避免硬解析,提高SQL语句执行的效率;
    缺点:如果使用绑定变量,那么优化器就会忽略直方图的信息,在生成执行计划的时候可能不够优化。

    2、MyISAN:
    不支持事务、外键,速度快、资源占有少;
    InnoDB:支持实物、外键、聚集索引,5.6版本以后的mysql支持全文索引;

    使用场景:
    需要支持事物的场景考虑InnoDB;
    以读为主的数据表用MyISAM;
    MyISAM奔溃后的系统的恢复较困难,没有要求的话可以用;
    不知道选什么数据库合适的话,用InnoDB不会差【5.5版本以后的mysql默认的引擎是InnoDB】

    3、oracle在共享池中进行缓存。

    【学习总结】
    1、get一个学习方法
    培养抽象事物的能力,掌握学习要点,如sql知识,重点掌握sql执行的原理,因为在不同的数据库中,sql执行的原理大同小异,只是在执行的顺序上有所不同。
    2、get一个oracle sql优化的技巧
    通过绑定变量,优化sql结果
    3、get一个oracle、mysql共同的执行sql的原理
    SQL语句-》缓存查询-》解析器-》优化器-》执行器
    【PS:老师后面能不能推荐一些实战项目练习,来巩固知识点呢?】
    2019-06-17
    2
    33
  • 虫子的一天
    老师好,我原来用SQLSERVER比较多,经常会碰到参数化的SQL查询中,因为SQLSERVER已经缓存了查询计划,导致某些特定参数查询效率很低的事情(刚才文中也有提及Oracle也有类似问题)。
    我刚听讲似乎MySQL是没这个机制的,是否MySQL就不会碰到类似问题?
    另外如果不让SQLserver使用缓存的查询计划,每次都重新生成,又导致CPU高,MYSQL又是如何避免类似问题的
    感谢
    2019-06-17
    19
  • Sam
    1.什么是绑定变量
    Oracle的绑定变量即是把谓词条件的具体值更换成一个变量,这样Oracle在共享池做hash映射时,同一类SQL但谓词条件值不同的,可以共享执行计划,进行软解析而不需要硬解析,例如
    select * from tab where id=1和select * from tab where id=10改成绑定量
    select * from tab where id=:a;

    2.绑定变量优缺点
    优点:减少硬解析,加快SQL处理过程,减少系统开销;
    缺点:绑定变量对应到不同的值,由于数据分布的问题,可能最佳的执行计划不一定是同一个,但是绑定变量在软解析时就固定对应到特定的执行计划上。

    解析后的SQL语句存放在Oracle的共享池。

    想请教老师一个问题,MySQL没有软硬解析的设计,那MySQL是怎么应对硬解析的低效呢?
    2019-06-17
    1
    9
  • NO.9
    C,共享池。
    讲的好系统啊,有种想学个花拳绣腿,结果教我九阳神功的感觉。
    2019-06-30
    7
  • 跳跳
    绑定变量:在SQL语句中使用变量,通过不同的变量取值来改变SQL的执行结果
    优点是可以做软解析,避免创建解析树,生成执行计划,提高oracle的运算效率
    缺点是可能会导致执行计划不够优化
    InnoDB 存储引擎:最大特点是支持事务、行级锁定、外键约束等
    MylSAM:不支持事务、也不支持外键,最大特点是速度快、占用资源少
    选择题选C,共享池的主要作用是缓存SQL语句和该语句的执行计划
    2019-06-17
    4
  • allean
    共享池
    2019-06-17
    4
  • 我不会算法
    老师, 我想提个建议, 可以吗?
    MySQL 的存储引擎是一大特色,其中 MyISAM 和 InnoDB 都是常用的存储引擎,这两个搜索引擎的特性和使用...
    这里好像写错了, 前面是存储引擎, 后面变成搜索引擎了;
    另外还有三个疑问, 希望老师可以答疑:
    1. <<MySQL实战45讲>>中, 林老师讲到的是, MySQL可以分为两层: Server层和存储引擎层(连接器是属于Server层), 您这里讲的是, 分三层: 连接层, SQL层 和 存储引擎层, 这个分层是没有严格的定义的吗?
    2. 上面那个图, https://static001.geekbang.org/resource/image/d6/a0/d6ab4e24003df69503bb055810a29fa0.jpg
    缓存查询 这一过程结束后, 在最后 有两个箭头, 一个指向了 执行器, 另一个指向了 输出结果, 这个略感迷惑;
    3. InnoDB是在5.5.5作为默认存储引擎的, 还是在5.5.8作为默认存储引擎的呢? 查了MySQL的网站, https://dev.mysql.com/doc/relnotes/mysql/5.5/en/news-5-5-5.html#mysqld-5-5-5-innodb
    好像是5.5.5?

    感谢老师的课程! 谢谢!
    收获很大!
    2019-06-19
    3
  • Demon.Lee
    另一篇文章说:5.5.5以上默认Engine是Innodb,这篇说是5.5.8,所以谁是对的?
    2019-06-17
    3
  • To you
    @吴青 回答下这位老哥的问题,在sql执行的时候 可能有触发器 得在执行器阶段才能确定的
    2019-06-29
    2
  • redrain
    老师,类似状态,status这种有几个固定值的列,有必要建立索引吗,广泛流传不需要建立,但是我发现建立有提升查询效率,innodb引擎5.7
    2019-06-17
    2
  • leslie
    再次听一遍不一样的东西还是会发现不一样的收货:这大概就是数据库用的多了有时代码层确实没啥 ,可是切换中的优化过程还是会疏漏某些分析细节。
    explain已经用到了极致,忘了优化的极限其实是多种方式的相辅相成;profile早期用过,反而这几年用的很少很少;explain更加管用-在多种数据库中,反而忘了有时需要一些简单的手段辅以。
    2019-06-17
    2
  • firstblood
    MyISAM 和InnoDB的比较参考https://www.jianshu.com/p/a957b18ba40d 这个文章
    2019-09-25
    1
  • robin
    老师,oracle中执行顺序中,是不是应该先进行权限校验更妥一些呢?如果语法和语义校验都通过的话,权限被校验住,是不是就前功尽弃了?
    2019-07-03
    1
    1
  • DriveMan_邱佳源
    老师,我想问一个问题就是mysql的用户权限检查,为什么是在优化器优化之后检查的,如果用户没有权限,那优化这一步不就是浪费更多资源吗,为什么不是在解析器解析之后执行权限检查的。
    2019-06-30
    1
    1
  • Ronnyz
    1、查看mysql存储引擎命令,

    在mysql>提示符下搞入show engines;

    字段 Support为:Default表示默认存储引擎


    2、设置InnoDB为默认引擎:

    在配置文件my.cnf中的 [mysqld] 下面加入

    default-storage-engine=INNODB 一句

     

    3、重启mysql服务器:

    mysqladmin -u root -p shutdown

    或者service mysqld restart 登录mysql数据库
    2019-06-29
    1
  • 吴青
    老师,mysql的sql层的鉴权为什么要放在第四步,语义分析完后是不是就可以鉴权了,省去了生成执行路径的开销。mysql为什么这么做呢
    2019-06-21
    1
收起评论
76
返回
顶部