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必知必会
登录|注册

32丨查询优化器是如何工作的?

陈旸 2019-08-23
我们总是希望数据库可以运行得更快,也就是响应时间更快,吞吐量更大。想要达到这样的目的,我们一方面需要高并发的事务处理能力,另一方面需要创建合适的索引,让数据的查找效率最大化。事务和索引的使用是数据库中的两个重要核心,事务可以让数据库在增删查改的过程中,保证数据的正确性和安全性,而索引可以帮数据库提升数据的查找效率。
如果我们想要知道如何获取更高的 SQL 查询性能,最好的方式就是理解数据库是如何进行查询优化和执行的。
今天我们就来看看查询优化的原理是怎么一回事。今天的主要内容包括以下几个部分:
什么是查询优化器?一条 SQL 语句的执行流程都会经历哪些环节,在查询优化器中都包括了哪些部分?
查询优化器的两种优化方式分别是什么?
基于代价的优化器是如何统计代价的?总的代价又如何计算?

什么是查询优化器

了解查询优化器的作用之前,我们先来看看一条 SQL 语句的执行都需要经历哪些环节,如下图所示:
你能看到一条 SQL 查询语句首先会经过分析器,进行语法分析和语义检查。我们之前讲过语法分析是检查 SQL 拼写和语法是否正确,语义检查是检查 SQL 中的访问对象是否存在。比如我们在写 SELECT 语句的时候,列名写错了,系统就会提示错误。语法检查和语义检查可以保证 SQL 语句没有错误,最终得到一棵语法分析树,然后经过查询优化器得到查询计划,最后交给执行器进行执行。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《SQL必知必会》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(12)

  • 老毕
    1. RBO 和 CBO 各自的特点是怎样的呢?

    RBO和CBO都基于规则,RBO使用静态规则,CBO使用动态规则。

    RBO的输出可以预期,稳定的输入得到稳定的输出。

    CBO的输出并不稳定,由很多不断改变的参数共同调节。

    2. 为什么 CBO 也存在不足?

    Cost Based有双关含义,一是它基于物理成本来考量执行计划,二是它自身就会消耗很大成本。

    CBO由很多参数共同决定,系统需要不断地调节它们,尽量保持其准确性。

    如果某些参数未能及时调整,不能如实表达其所代表的物理特性,会使得CBO发生误判。

    为了减少误判,必须消耗一定的系统资源,用于频繁地收集和计算各项参数。

    CBO的优势也恰恰就是它的不足,充分理解CBO,对实际工作很有帮助。

    作者回复: 对的,充分理解CBO,对实际工作很有帮助。

    2019-08-25
    7
  • 许童童
    RBO 和 CBO 各自的特点是怎样的呢?
    RBO基于规则,每条sql经过RBO优化出来的结果都是固定的。
    CBO基于代价,根据统计信息,配置参数,优化器参数,sql经过优化出来的结果不是固定的,有点类似利用统计学得到最佳的优化结果。

    为什么 CBO 也存在不足?
    CBO比较复杂,任何一个参数没有调好,可能优化结果都不理想,还有就是统计信息的准确度,如果要很高的准确度,那么修护这个高准确度带到的代价也是很大的。

    作者回复: 对的,一个基于规则,一个基于数据。数据虽好,但也存在数据准确度,计算代价的限制

    2019-08-23
    4
  • 雪飞鸿
    每一种解决问题的方式都有其代价,要考虑成本和收益问题

    作者回复: 对的 任何事情都要balance,尤其是在工程领域,更需要

    2019-11-25
  • 书痕
    1. RBO 和 CBO分别对应经验驱动和数据驱动,也可类比于于工厂化生产与手动定制。前者快但比较粗糙,后者精准但需要复杂计算。
    2. CBO因为要对大量参数进行计算,因此难免出现偏差,且数据量少的情况下,优化的成本过高(优化还不如不优化)。

    作者回复: 对 这样比喻不错

    2019-11-06
  • Yuhui
    请教一下老师:“执行计划就是查询树,它由一系列物理操作符组成”这句话怎么理解?谢谢!

    作者回复: 这些操作符按一定的运算关系组成查询计划(查询的执行方案),比如两个数据表A和B进行连接,在优化器内部会存在嵌套循环连接,归并连接,Hash连接 三种物理连接方式。同样A,B,C三张表进行联查,也存在连接顺序的问题。所以具体的查询计划,是由物理操作符组成的树形结构

    2019-09-27
  • 小白鼠丶
    我想问下在什么情况下IO会很高
    2019-09-11
  • 空知
    CBO 做搜索空间的剪枝 是不考虑全部可能的意思吗?
    2019-09-01
  • leslie
    其实不同数据库这块其实都是不一样的:尤其是在查询优化器中各自都加了自己的特性在里面,虽然我们很多时候发现执行语句类似;可是还是不同的。
          sql server和mysql早期接近一点,可是后面随着oracle对其兼并之后会明显的发现完全就变成属于oracle的小弟的感觉。这种关系就像微软有sql server和Access,甲骨文有oracle和mysql;当然非商业版的MariaDB还是比较保持了原生态的东西。5.7没有看。
          mysql不像老师说的那样吧,尤其是5.7之前多种表引擎,不同引擎有不同的特性其实还是有些不同的;只使用一种表引擎是5.7才开始的;目前市面主流依然停留在5.6吧,国内各大云厂商自推的基于MYSQL的都是基于5.6.
    2019-08-25
  • 一步
    去查看 server_cost 的表中的记录,为什么看不到每个操作的 cost 的默认值呢? 没有 default_value 那一列

    mysql 的版本:5.17。18
    2019-08-24
  • ttttt
    CBO会根据代价评估模型,计算每条可能的执行计划的代价,对于复杂的数据情况,评估模型时会导致开销过大。
    2019-08-23
  • Cue
    老师,专栏会有mysql触发器的部分吗
    2019-08-23
  • Demon.Lee
    这里对内存代价和远程代价不进行讲解,我们只需要关注 I/O 代价和 CPU 代价即可。
    ——不讲解,是因为很复杂吗?

    作者回复: IO代价和CPU代价在总代价中占比高,因为我们通常会做大量的IO操作,以及内存中的查找比较。Memory代价指的是内存拷贝代价。另外Memory和Remote代价系统会自动帮计算,而IO和CPU代价(内存中的查找代价)是我们进行成本估算中更关注的

    2019-08-23
收起评论
12
返回
顶部