后端存储实战课
李玥
美团高级技术专家
44005 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 30 讲
结束语 (1讲)
后端存储实战课
15
15
1.0x
00:00/00:00
登录|注册

10 | 走进黑盒:SQL是如何在数据库中执行的?

优化物理执行计划
转换逻辑执行计划为物理执行计划
物理存储结构
优化逻辑执行计划
生成逻辑执行计划
生成抽象语法树(AST)
解析SQL语句
比较执行器和存储引擎与MySQL的不同
分析非关系型数据库的查询执行过程
尽早执行投影和数据过滤
尽量不在WHERE条件中对列做计算
存储引擎
执行器
思考题
优化方法
SQL执行过程
走进黑盒:SQL是如何在数据库中执行的?
参考文章

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

你好,我是李玥。
上一节课我们讲了怎么来避免写出慢 SQL,课后我给你留了一道思考题:在下面这两个 SQL 中,为什么第一个 SQL 在执行的时候无法命中索引呢?
SELECT * FROM user WHERE left(department_code, 5) = '00028';
SELECT * FROM user WHERE department_code LIKE '00028%';
原因是,这个 SQL 的 WHERE 条件中对 department_code 这个列做了一个 left 截取的计算,对于表中的每一条数据,都得先做截取计算,然后判断截取后的值,所以不得不做全表扫描。你在写 SQL 的时候,尽量不要在 WEHER 条件中,对列做任何计算。
到这里这个问题就结束了么?那我再给你提一个问题,这两个 SQL 中的 WHERE 条件,虽然写法不一样,但它俩的语义不就是一样的么?是不是都可以解释成:department_code 这一列前 5 个字符是 00028?从语义上来说,没有任何不同是吧?所以,它们的查询结果也是完全一样的。那凭什么第一条 SQL 就得全表扫描,第二条 SQL 就可以命中索引?
对于我们日常编写 SQL 的一些优化方法,比如说我刚刚讲的:“尽量不要在 WEHER 条件中,对列做计算”,很多同学只是知道这些方法,但是却不知道,为什么按照这些方法写出来的 SQL 就快?
要回答这些问题,需要了解一些数据库的实现原理。对很多开发者来说,数据库就是个黑盒子,你会写 SQL,会用数据库,但不知道盒子里面到底是怎么一回事儿,这样你只能机械地去记住别人告诉你的那些优化规则,却不知道为什么要遵循这些规则,也就谈不上灵活运用。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

SQL在数据库中的执行过程是一个复杂的过程,需要经历语法解析、生成抽象语法树、逻辑执行计划生成等多个步骤。执行器负责解析SQL语句,生成逻辑执行计划,而存储引擎则负责保存数据。在执行计划中,优化查询的执行逻辑是非常重要的,尽早地减少必须处理的数据量可以提高查询效率。通过优化执行计划,可以在执行JOIN操作前,尽量减少需要JOIN的数据量,从而提高查询性能。 文章详细介绍了SQL在存储引擎中的执行过程,以MySQL为例,解释了存储引擎的物理存储结构和逻辑执行计划转换为物理执行计划的过程。物理执行计划可以根据数据的物理存储结构、是否存在索引以及数据多少等各种因素进行优化。理解数据库执行SQL的过程和不同存储引擎中的数据和索引的物理存储结构对于正确使用和优化SQL非常有帮助。 最后,文章指出掌握查询的执行过程和数据库内部的组成有助于更好地理解数据库行为,更高效地使用数据库。并鼓励读者对自己熟悉的非关系型数据库进行查询执行过程的分析,以及与MySQL的执行器和存储引擎的不同之处进行比较。 总的来说,本文通过深入讲解SQL在数据库中的执行过程,帮助读者了解了SQL执行的原理和优化方法,为读者打开了数据库的“黑盒子”,使他们能够更深入地理解数据库的工作原理。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《后端存储实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(21)

  • 最新
  • 精选
  • 李鑫
    老师好,看了你的课程 感觉有点浅,比如这一篇只是简单介绍了下索引和数据的底层存储结构。像页分裂这些更加底层的没有讲到,建议老师后续的课程可以由浅入深。

    作者回复: 咱们这个课程是个实战课,所以更偏重于解决实战问题。实战会用到的一些原理,也会尽量简单明了的去给大家讲明白。

    2020-03-19
    4
    29
  • 暴力的小石头
    我想问一下,文中提到逻辑执行计划,就是那个像函数调用栈的东西是怎么得来的呀,感觉比explain分析的更深层次,想问一下如何分析出来的

    作者回复: 我们这个例子中的逻辑执行计划和物理执行计划并不是用什么工具生成的,逻辑执行计划和物理执行计划都是以各种数据结构存放在数据库的内存中。

    2020-04-28
    2
    5
  • 存储引擎再执行执行计划的的时候,是把整个执行计划执行完成后把数据返给执行器,还是每执行一条执行计划获取数据就返给执行器,然后执行器在做运算的? 个人认为是整个执行计划执行完成后获得最终的数据在返给执行器,但是这个有没有办法去验证的?

    作者回复: 一般都是在存储引擎直接执行的。

    2020-03-19
    1
  • 夏目
    主键除了不能太长之外最好能有序,有序的话能减少插入时B+树的排序操作,所以uuid这种不适合做主键
    2020-04-04
    1
    28
  • Simon
    文中说: 每一行数据直接就保存在 B+ 树的叶子节点上 这句话可能会有误会, 实际上B+树的节点存的是"页", 而具体的数据在页里面
    2020-03-19
    1
    15
  • image
    比较典型的是Hive,不少开源组件直接借用其SQL解析器,完成逻辑层优化,物理层用其他方式执行。
    2020-03-26
    6
  • Sinvi
    推荐隔壁《SQL必知必会》这里有讲比较详细
    2020-11-20
    4
  • 南山
    很赞同为什么要了解原理的原因,只有知道原理以及内部执行逻辑,遇到问题才能不会像无头苍蝇一样靠运气和蒙。
    2020-03-19
    4
  • 大叶枫
    建议配合实际工作场景得问题,逐步深入的来解执行计划的实战用途。
    2020-03-19
    3
  • Geek_fe19fb
    索引失效的原因: 1. 没有正确的使用like 2. 使用了or ,索引是符合索引,单列索引是可以的 (跟版本有关系 在MySQL8.0) 3. 不符合前缀索引的用法,带头大哥不能死 4. 索引列使用了函数 5. 索引列类型不一致,导致索引失效 6. 索引列字符集不一致 7. 使用了不等于 8. 范围查询之后的索引都会失效
    2022-04-02
    2
收起评论
显示
设置
留言
21
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部